gpt4 book ai didi

python - 函数的条形图 - 有条件地更改函数内条形的顺序

转载 作者:行者123 更新时间:2023-12-01 08:15:34 24 4
gpt4 key购买 nike

我有以下df,我想从中创建条形图:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

df = pd.DataFrame({
'Country': ["A", "B", "C", "D", "E", "F", "G"],
'Answer declined': [0.000000, 0.000000, 0.000000, 0.000667, 0.000833, 0.000833, 0.000000],
"Don't know": [0.003333, 0.000000, 0.000000, 0.001333, 0.001667, 0.000000, 0.000000],
"No": [0.769167, 0.843333, 0.762000, 0.666000, 0.721667, 0.721667, 0.775833],
"Yes": [0.227500, 0.156667, 0.238000, 0.332000, 0.275833, 0.277500, 0.224167]}, )
df.set_index("Country", inplace = True)

由于我有多个这样的 df,我创建了一个函数来从不同的 df 调用条形图:

def bar_plot(plot_df):
N = len(plot_df) # number of groups
num_y_cats = len(plot_df.columns) # number of y-categories (responses)
ind = np.arange(N) # x locations for the groups
width = 0.35 # width of bars

p_s = []
p_s.append(plt.bar(ind, plot_df.iloc[:,0], width))
for i in range(1,len(plot_df.columns)):
p_s.append(plt.bar(ind, plot_df.iloc[:,i], width,
bottom=np.sum(plot_df.iloc[:,:i], axis=1),
label = 'TEST'))
plt.ylabel('[%]')
plt.title('Responses by country')

x_ticks_names = tuple([item for item in plot_df.index])

plt.xticks(ind, x_ticks_names)
plt.yticks(np.arange(0, 1.1, 0.1)) # ticks from, to, steps
plt.legend(p_s, plot_df.columns,
bbox_to_anchor = (0.5, -0.25),
#bbox_to_anchor = (0., 1.02, 1., .102),
loc = 'lower center',
ncol = num_y_cats // 2,
borderaxespad = 0
)
plt.show()
plt.close() # close the figure

bar_plot(df)

这可行,但我无法解决结果图中的一个问题:如果响应(即列名称)包含"is",我希望首先显示它(即在底部) - 并且不更改任何内容否则得到的结果。

到目前为止我的尝试基于 this提问失败。

编辑:我找到了一个解决方案,现在正在寻找一个优雅解决方案。

最佳答案

既然您已经在使用pandas.DataFrame,为什么不使用便捷方法plot() :

def bar_plot(plot_df):
N, num_y_cats = plot_df.shape

width = 0.35

cols = plot_df.columns.tolist()

if 'Yes' in cols:
cols.insert(0, cols.pop(cols.index('Yes')))

plot_df[cols].plot(kind='bar',
stacked=True,
width=width,
title='Responses by country'
)

plt.ylabel('[%]')
plt.xlabel('')
plt.xticks(rotation=0)
plt.yticks(np.arange(0, 1.1, 0.1))
plt.legend(loc='lower center',
ncol = num_y_cats // 2,
bbox_to_anchor = (0.5, -0.25),
borderaxespad = 0
)

plt.show()
plt.close() # close the figure

bar_plot(df)

关于python - 函数的条形图 - 有条件地更改函数内条形的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54998761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com