Seaborn Catplot установить значения над решетками - PullRequest
1 голос
/ 09 апреля 2019

Я построил catplot в seaborn, как это

g = sns.catplot(x='year', y='income', data=df, kind='bar', hue='geo_name', legend=True)
g.fig.set_size_inches(15,8)
g.fig.subplots_adjust(top=0.81,right=0.86)  

Я получаю вывод, как показано ниже

enter image description here

Я хочу добавить значения каждого бара вверху в K представлении.Например, в 2013 столбец для Michigan находится на 48411, поэтому я хочу добавить значение 48.4K поверх этого бара.Аналогично для всех баров.

Используемые мной данные размещены ниже.

year,geo_name,geo,income,income_moe
2016,Michigan,04000US26,50803.0,162.0
2013,Michigan,04000US26,48411.0,163.0
2014,Michigan,04000US26,49087.0,192.0
2015,Michigan,04000US26,49576.0,186.0
2016,"Washtenaw County, MI",05000US26161,62484.0,984.0
2013,"Washtenaw County, MI",05000US26161,59055.0,985.0
2014,"Washtenaw County, MI",05000US26161,60805.0,958.0
2015,"Washtenaw County, MI",05000US26161,61003.0,901.0
2016,"Ann Arbor, MI",16000US2603000,57697.0,2046.0
2013,"Ann Arbor, MI",16000US2603000,55003.0,1688.0
2014,"Ann Arbor, MI",16000US2603000,56835.0,1320.0
2015,"Ann Arbor, MI",16000US2603000,55990.0,1259.0
2016,"Philadelphia, PA",16000US4260000,39770.0,567.0
2013,"Philadelphia, PA",16000US4260000,37192.0,424.0
2014,"Philadelphia, PA",16000US4260000,37460.0,430.0
2015,"Philadelphia, PA",16000US4260000,38253.0,511.0
2016,"Ann Arbor, MI Metro Area",31000US11460,62484.0,984.0
2013,"Ann Arbor, MI Metro Area",31000US11460,59055.0,985.0
2014,"Ann Arbor, MI Metro Area",31000US11460,60805.0,958.0
2015,"Ann Arbor, MI Metro Area",31000US11460,61003.0,901.0

1 Ответ

1 голос
/ 09 апреля 2019

Это грубое решение, но оно помогает.

Мы добавляем текст к axes объекту, созданному на графике.

Позиция Y проста, так какточно соответствует значению данных.Мы могли бы просто добавить 500 к каждому значению, чтобы метка удобно располагалась в верхней части столбца.Позиция X начинается и центрируется в 0 для первой группы столбцов (2013), и она занимает единицу.У нас есть буфер 0.1 на каждой стороне, и столбцы 5, следовательно, каждый столбец имеет ширину 0,16.

g = sns.catplot(x='year', y='income', data=df, kind='bar', hue='geo_name', legend=True)
#flatax=g.axes.flatten()
#g.axes[0].text=('1')
g.fig.set_size_inches(15,8)
g.fig.subplots_adjust(top=0.81,right=0.86)
g.ax.text(-0.5,51000,'X=-0.5')
g.ax.text(-0.4,49000,'X=-0.4')
g.ax.text(0,49000,'X=0')
g.ax.text(0.5,51000,'X=0.5')
g.ax.text(0.4,49000,'X=0.4')
g.ax.text(0.6,47000,'X=0.6')

limits

Текст по умолчанию выровнен по левому краю (то есть до установленного нами значения x). Здесь - документация, если вы хотите поиграть с текстом (изменить шрифт, выравнивание и т. Д.)

Затем мы можем найти правильное размещение для каждой метки, зная, что 3-й столбецкаждая группа всегда будет сосредоточена на единице (0,1,2,3,4).

g = sns.catplot(x='year', y='income', data=df, kind='bar', hue='geo_name', legend=True)
#flatax=g.axes.flatten()
#g.axes[0].text=('1')
g.fig.set_size_inches(15,8)
g.fig.subplots_adjust(top=0.81,right=0.86)
g.ax.text(-0.4,48411+500,'48,4K')
g.ax.text(-0.24,59055+500,'59,0K')
g.ax.text(-0.08,55003+500,'55,0K')
g.ax.text(0.08,37192+500,'37,2K')
g.ax.text(0.24,59055+500,'59,0K')

labelled

Конечно, вместопомечая вручную все, что вам нужно, циклически просматривая данные и автоматически создавая метки

for i, yr in enumerate(df['year'].unique()):
    for j,gn in enumerate(df['geo_name'].unique()):

Теперь вы можете выполнять итерацию по вашей позиции x, используя: i-0.4+(j*0.16), и в то же время у вас есть значение для year иgeo_name для получения правильного значения income.

...