#python #pandas #matplotlib #seaborn
Вопрос:
Я работаю с набором данных, который содержит категориальные ответы, разделенные запятыми, в своих столбцах, и пытаюсь построить диаграмму рассеяния, аналогичную приведенной ниже. Я думаю, что правильным подходом могло бы быть использование диаграммы скопления морских птиц, например: ax = sns.swarmplot(x="id", y="family", data=dftest)
но результат далек от того, что я ищу. Я ищу несколько советов о том, как я могу работать над восстановлением аналогичного сюжета?
примеры данных:
ID | семья | город | нация | Мир |
---|---|---|---|---|
1 | на следующей неделе, через несколько лет | на следующей неделе, через несколько лет | продолжительность жизни | целая жизнь детей |
2 | следующие несколько лет, всю жизнь | целая жизнь детей | следующие несколько лет | на следующей неделе, через несколько лет, жизнь детей |
3 | на следующей неделе, через несколько лет | продолжительность жизни | целая жизнь детей | целая жизнь детей |
4 | на следующей неделе, через несколько лет | следующие несколько лет | на следующей неделе, через несколько лет, всю жизнь, | на следующей неделе, через несколько лет, жизнь детей |
5 | следующие несколько лет, всю жизнь | целая жизнь детей | целая жизнь детей | продолжительность жизни |
figure source: Meadows, D., Meadows, D., Randers, J. and Behrens, W., 1972. The Limits to growth. A report for the club of Rome's project on the predicament of mankind. 1st ed. New York: Universe Books.
Ответ №1:
Насколько я знаю, ожидаемого результата, представленного на изображении, трудно достичь с помощью библиотеки графиков python, поэтому я попытался имитировать желаемый результат из swarmplot сиборна. Я надеюсь, что этот пост приведет к некоторым отличным ответам от опытных инженеров.
import pandas as pd
import numpy as np
import io
data = '''
id family city nation world
1 "next week,next few years" "next week,next few years" lifetime "children's lifetime"
2 "next few years,lifetime" "children's lifetime" "next few years" "next week,next few years,children's lifetime"
3 "next week,next few years" lifetime "children's lifetime" "children's lifetime"
4 "next week,next few years" "next few years" "next week,next few years,lifetime," "next week,next few years,children's lifetime"
5 "next few years,lifetime" "children's lifetime" "children's lifetime" lifetime
'''
df = pd.read_csv(io.StringIO(data), delim_whitespace=True)
dfs = pd.concat([
df['family'].str.split(',', expand=True).rename(columns={0:'family',1:'family'}),
df['city'].str.split(',', expand=True).rename(columns={0:'city',1:'city'}),
df['nation'].str.split(',', expand=True).rename(columns={0:'nation',1:'nation',2:'nation'}),
df['world'].str.split(',', expand=True).rename(columns={0:'world',1:'world',2:'world'})
], axis=1)
dfs = dfs.unstack().to_frame(name='TIME').reset_index().rename(columns={'level_0':'SPACE'})
dfs['TIME'].replace('', np.NaN, inplace=True)
dfs.dropna(subset=['TIME'], inplace=True)
import seaborn as sns
ax = sns.swarmplot(x="TIME", y="SPACE", data=dfs, size=15)
ax.grid(which='minor', axis='both')
print(ax.get_ylim())
ax.set_ylim(-0.5, 3.5)
for y_pos in [0.5, 1.5, 2.5]:
ax.axhline(y=y_pos, color='k', lw=0.8)
for x_pos in [0.5, 1.5, 2.5]:
ax.axvline(x=x_pos, color='k', lw=0.8)