![](/img/trans.png)
[英]matplotlib: plot multiple columns of pandas data frame on the bar chart
[英]matplotlib bar chart with data frame row names as legend
我正在嘗試使用pandas數據幀的值設置條形圖的圖例。 我搜索並找不到解決方案,我使用了另一個來自SO的片段來注釋條形碼。 生成的圖表按照我的要求顯示了系列中不同顏色的條形,甚至是條形圖的值。 例如,在Excel中,您可以使用將圖例值顯示為圖例的圖例。 我想在這里獲得這個功能。
這是一個MWE:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
import seaborn, itertools
seaborn.set()
def flip(items, ncol):
return itertools.chain(*[items[i::ncol] for i in range(ncol)])
def annotateBars(row, ax=ax):
if row['A'] < 0.2:
color = 'black'
vertalign = 'bottom'
vertpad = 0.02
else:
color = 'white'
vertalign = 'top'
vertpad = -0.02
ax.text(row.name, row['A'] + vertpad, "{:.4f}%".format(row['A']),
zorder=10, rotation=90, color=color,
horizontalalignment='center',
verticalalignment=vertalign,
fontsize=14, weight='heavy')
labels1=["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
width = 0.75
my_colors = 'gbkymc'
arr1 = np.random.random((1, 5))
arr1_ind = np.arange((arr1.shape[1]))
df_arr1 = pd.DataFrame(zip(*arr1), index = arr1_ind, columns = ['A'])
ax = df_arr1.plot(kind='bar', width = 0.85, alpha = 0.5, color = my_colors)
# plt.xticks(arr1_ind+width/4, arr1_ind)
ax.set_xticks(arr1_ind)
ax.set_xticklabels([labels1[i] for i in arr1_ind])
hndls, lbls = ax.get_legend_handles_labels()
plt.legend(flip(hndls, 2), flip(labels1, 2), loc='best', ncol=2)
junk = df_arr1.apply(annotateBars, ax=ax, axis=1)
plt.tick_params(
axis='x', # changes apply to the x-axis
which='both', # both major and minor ticks are affected
bottom='off', # ticks along the bottom edge are off
top='off', # ticks along the top edge are off
labelbottom='off') # labels along the bottom edge are off
plt.tight_layout()
plt.show()
聽起來你想要傳奇每種顏色都有一個項目。
現在,您只創建一個藝術家(一次調用bar
),因此圖例只有一個條目。
作為一個類似於你想要的東西的簡單例子:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
df = pd.DataFrame({
'value':np.random.random(5),
'label':['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'],
'color':['g', 'b', 'k', 'y', 'm']})
fig, ax = plt.subplots()
# Plot each bar separately and give it a label.
for index, row in df.iterrows():
ax.bar([index], [row['value']], color=row['color'], label=row['label'],
alpha=0.5, align='center')
ax.legend(loc='best', frameon=False)
# More reasonable limits for a vertical bar plot...
ax.margins(0.05)
ax.set_ylim(bottom=0)
# Styling similar to your example...
ax.patch.set_facecolor('0.9')
ax.grid(color='white', linestyle='-')
ax.set(axisbelow=True, xticklabels=[])
plt.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.