[英]matplotlib advanced bar plot
I need to recreate a chart similar to the one below created in Excel.我需要重新创建一个类似于下面在 Excel 中创建的图表。 I was hoping to use matplotlib, but can't seem to find any examples or reference for how to do a chart like this.我希望使用 matplotlib,但似乎找不到关于如何制作这样的图表的任何示例或参考。 I need to have bars colored based on a performance threshold, and also display the threshold.我需要根据性能阈值对条形进行着色,并显示阈值。 Can anyone point me in the right direction?任何人都可以指出我正确的方向吗? I do need to be able to do this with Python, though.不过,我确实需要能够用 Python 做到这一点。
I gotta run, but here's something to get you started:我得跑了,但这里有一些东西可以让你开始:
import numpy as np
import matplotlib
matplotlib.rcParams['text.usetex'] = False
import matplotlib.pyplot as plt
import pandas
df = pandas.DataFrame(np.random.uniform(size=37)*100, columns=['A'])
threshold = 75
fig, ax = plt.subplots(figsize=(8,3))
good = df['A'][df['A'] >= threshold]
bad = df['A'][df['A'] < threshold]
ax.bar(left=good.index, height=good, align='center', color='ForestGreen', zorder=5)
ax.bar(left=bad.index, height=bad, align='center', color='Firebrick', zorder=5)
ax.axhline(y=threshold, linewidth=2, color='ForestGreen', zorder=0)
ax.set_xticks(df.index)
ax.set_xlim(left=df.index[0]-0.75, right=df.index[-1]+0.75)
def annotateBars(row, ax=ax):
if row['A'] < 20:
color = 'black'
vertalign = 'bottom'
vertpad = 2
else:
color = 'white'
vertalign = 'top'
vertpad = -2
ax.text(row.name, row['A'] + vertpad, "{:.1f}%".format(row['A']),
zorder=10, rotation=90, color=color,
horizontalalignment='center',
verticalalignment=vertalign,
fontsize=8, weight='heavy')
junk = df.apply(annotateBars, ax=ax, axis=1)
And that gives me:这给了我:
This can now be plotted much more concisely:现在可以更简洁地绘制:
Axes.bar_label
automatically labels bars ( requires matplotlib 3.4.0+ ) Axes.bar_label
自动标记条形(需要 matplotlib 3.4.0+ )Axes.bar
has a color
param that can accept an array of colors (eg via numpy.where
) Axes.bar
有一个color
参数,可以接受一组颜色(例如通过numpy.where
) So now it only takes a handful of lines, eg using Paul's sample df = pd.DataFrame({'A': np.random.uniform(size=35) * 100})
:所以现在它只需要几行,例如使用保罗的样本df = pd.DataFrame({'A': np.random.uniform(size=35) * 100})
:
fig, ax = plt.subplots(figsize=(9, 3))
threshold = 75
# plot bars as blue if A > threshold, else red
color = np.where(df.A > threshold, 'blue', 'red')
ax.bar(x=df.index, height=df.A, color=color)
# add bar labels
ax.bar_label(ax.containers[0], fmt='%.1f%%')
# add threshold line
ax.axhline(threshold, alpha=0.5, zorder=0)
Or for multiple thresholds, just update color
as desired (eg via numpy.select
):或者对于多个阈值,只需根据需要更新color
(例如通过numpy.select
):
upper, lower = 75, 25
color = np.select([df.A > upper, df.A < lower], ['blue', 'red'], default='gray')
Note that a color array can also be passed into other bar plot helpers:请注意,颜色数组也可以传递给其他条形图助手:
DataFrame.plot.bar
: DataFrame.plot.bar
:
df.plot.bar(y='A', color=color, ax=ax)
Series.plot.bar
: Series.plot.bar
:
df.A.plot.bar(color=color, ax=ax)
seaborn.barplot
(as palette
): seaborn.barplot
(作为palette
):
sns.barplot(x=df.index, y=df.A, palette=color, ax=ax)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.