热线电话:13121318867

登录
2019-03-05 阅读量: 751
函数条形图 - 有条件地改变函数内条形的顺序

我有以下内容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)

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

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)

这有效但我无法解决结果图中的一个问题:如果响应(即列名称)包含“是”,我希望首先显示它(即在底部) - 否则在结果图中不改变任何内容。

解决办法:我找到了一个解决方案,但是最有效和pythonic的解决方案似乎有点太费力了

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

### inserted these lines

cols = plot_df.columns.tolist()

if 'Yes' in cols:

cols = cols[cols.index('Yes'):] + cols[:cols.index('Yes')]

#print(cols)

#cols.insert(0, 'Yes')

yes = pd.Series(plot_df['Yes'])

del plot_df['Yes']

plot_df.insert(0, 'Yes', yes)

#### end of insertion

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()

0.0000
1
关注作者
收藏
评论(0)

发表评论

暂无数据
推荐帖子