sar*_*iii 1 python matplotlib data-analysis dataframe pandas
这是我的数据框:
6month final-formula Question Text numPatients6month
286231 1 0.031730 CI_FINANCE 977
286270 1 0.147390 CI_MJO 977
286276 1 0.106448 CI_CONCENTRATING 977
286700 2 0.010323 CI_MJO 775
286323 2 0.018065 CI_FINANCE 775
286401 2 0.034839 CI_CONCENTRATING 775
286228 3 0.032020 CI_CONCENTRATING 812
286238 3 0.061576 CI_MJO 812
286292 3 0.008621 CI_FINANCE 812
286690 4 0.008097 CI_MJO 741
286342 4 0.005398 CI_FINANCE 741
286430 4 0.060729 CI_CONCENTRATING 741
286481 5 0.009840 CI_FINANCE 813
287441 5 0.008610 CI_MJO 813
286362 5 0.041820 CI_CONCENTRATING 813
286360 6 0.021622 CI_CONCENTRATING 740
286492 6 0.017568 CI_FINANCE 740
286494 6 0.014865 CI_MJO 740
286482 7 0.015464 CI_FINANCE 776
286483 7 0.042526 CI_MJO 776
286599 7 0.011598 CI_CONCENTRATING 776
286361 8 0.024490 CI_CONCENTRATING 735
286989 8 0.004082 CI_FINANCE 735
286402 8 0.021769 CI_MJO 735
287119 9 0.003916 CI_FINANCE 766
286408 9 0.011749 CI_MJO 766
286399 9 0.019582 CI_CONCENTRATING 766
286267 10 0.019337 CI_CONCENTRATING 724
286249 10 0.037293 CI_MJO 724
286810 10 0.008287 CI_FINANCE 724
Run Code Online (Sandbox Code Playgroud)
我已将此数据框绘制为堆积条形图。此堆积条形图基于(6month,final-formula).
如您所见numPatients6month,数据框中有。我想在堆叠条的每个类别上显示这个数字。例如:
所以根据上面的堆叠条,我想977在第一个条中显示蓝色,显示 977 表示CI_Finance哪个是orange color。
它与 此问题不同,因为它不是堆叠条,也与 此不同,因为我将显示(numPatients6month)数据框中的另一列,而不是y-axis. y 轴是final-formula,但我想numPatients6month在每个堆叠条的每种颜色上显示。
就像信息一样,我使用以下代码绘制了上述内容:
df = dffinal.drop('numPatients6month', 1).groupby(['6month','Question Text']).sum().unstack('Question Text')
df.columns = df.columns.droplevel()
ax=df.plot(kind='bar', stacked=True)
import matplotlib.pyplot as plt
plt.xticks(range(0,10), ['6month','1 year','1.5 year','2 year','2.5 year','3 year','3.5 year','4 year','4.5 year','5 year'], fontsize=8, rotation=45)
plt.title('Cognitive Impairement-Stack bar')
plt.show()
Run Code Online (Sandbox Code Playgroud)
谢谢, :)
这是一种方法:
ax=df.plot(kind='bar', stacked=True)
#loop to add the text
list_values = (dffinal['numPatients6month'].tolist()[::3]
+ dffinal['numPatients6month'].tolist()[1::3]
+ dffinal['numPatients6month'].tolist()[2::3])
for rect, value in zip(ax.patches, list_values):
h = rect.get_height() /2.
w = rect.get_width() /2.
x, y = rect.get_xy()
ax.text(x+w, y+h,value,horizontalalignment='center',verticalalignment='center')
#same than your code
plt.xticks(range(0,10), ['6month','1 year','1.5 year','2 year','2.5 year','3 year','3.5 year','4 year','4.5 year','5 year'], fontsize=8, rotation=45)
plt.title('Cognitive Impairement-Stack bar')
plt.show()
Run Code Online (Sandbox Code Playgroud)
该list_values是从以相同的顺序比列“numPatients6month”获得的价值rect来自ax.patches 其结果是:
但是因为有些条很小,所以结果并不容易阅读。
编辑:关于循环,ax.patches包含了所有你绘制栏的信息,所以对于每一个栏,我命名的rect,与get_xy你的栏左下角的位置,并用get_height(:R get_width),得到高度(R宽度) 的酒吧。所以 (x+w, y+h) 给出了条形中间的坐标,您可以在其中添加文本value(from list_values) 和函数ax.text(参数horizontalalignment和verticalalignment将文本居中)
编辑 2:更通用的方法,感谢@SpghttCd 获得 list_values
list_values = (dffinal.drop('final-formula', 1).groupby(['6month','Question Text']).sum()
.unstack('Question Text').fillna(0).astype(int).values.flatten('F'))
for rect, value in zip(ax.patches, list_values):
if value != 0:
h = rect.get_height() /2.
w = rect.get_width() /2.
x, y = rect.get_xy()
ax.text(x+w, y+h,value,horizontalalignment='center',verticalalignment='center')
Run Code Online (Sandbox Code Playgroud)
您可以直接从数据集中计算标签的 x 和 y 位置:
x_lbl = dffinal['6month'].values - 1
y_lbl = (df.cumsum(axis=1) - df/2).values.flatten()
Run Code Online (Sandbox Code Playgroud)
标签的排列可以按照您对数据所做的相同方式完成:
df_lbl = dffinal.drop('final-formula', 1).groupby(['6month','Question Text']).sum().unstack('Question Text')
lbl = df_lbl.values.flatten()
Run Code Online (Sandbox Code Playgroud)
然后循环遍历 x、y 和标签数组的列表:
for x, y, txt in zip(x_lbl, y_lbl, lbl):
plt.text(x, y, txt, va='center', ha='center')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3689 次 |
| 最近记录: |