如何在matplotlib pyplot条形图中反转条形大小?

时间:2020-01-02 20:56:22

标签: python matplotlib

我正在尝试设置一个倒置的轴条形图,以便较小的数字具有较大的条形,并且这些条形从条形图的顶部开始。理想情况下,我的y轴从底部的10e-10到顶部的10e-2不等,看起来类似于以下excel图: enter image description here

在呈现此数据时,将数字降低是更好的选择,所以我希望用更大的条形来表示,而不是没有条形。

反转y轴限制会使小节从顶部开始,但这并不能解决我的问题,因为小节仍然与小节相关联。有什么方法可以移动原点,并指定应将条形图从原点绘制到轴上的适当刻度线?

这里的数据和代码实际上并不那么重要,但这是摘录:

plt.rcParams['xtick.bottom'] = plt.rcParams['xtick.labelbottom'] = False
plt.rcParams['xtick.top'] = plt.rcParams['xtick.labeltop'] = True
barVals = [ 10**(-x) for x in range(10) ]
ticks = [x for x in range(10)]
plt.bar(ticks, barVals)
plt.yscale('log')
plt.ylim([1e-2, 1e-10])
#plt.axes().spines['bottom'].set_position(('data', 0))
plt.show()

enter image description here

结果图具有较大的条形,表示较大的数字,较小的条形图,表示较小的数字。相反,我可以绘制每个值与最大值之间的差异,但我希望在matplotlib / pyplot中有一些内置的方法可以实现这一点。

使用matlab,我正在寻找的功能是设置轴基准值:

b = bar(ticks, barValues);
b(1).BaseValue = 1e0;

1 个答案:

答案 0 :(得分:1)

鉴于轴的正常对数缩放的工作方式,我认为最好的选择是手动缩放数据,并调整标签以匹配。以下是使用OO API入门的简单示例:

data = 10.0**np.arange(-2, -7, -1)
plot_data = np.log10(data)

fig, ax = plt.subplots()
ax.bar(np.arange(data.size) + 1, plot_data)

您可以手动设置刻度,但是我建议使用Formatter

from matplotlib.ticker import StrMethodFormatter
...
ax.yaxis.set_major_formatter(StrMethodFormatter('$10^{{{x}}}$'))

This particular Formatter接受适用于str.format的模板字符串,并使用绑定到名称x的刻度值对其进行插值。如果只想显示指数的整数部分,则可以将其初始化为

 StrMethodFormatter('$10^{{{x:.0f}}}$')

符号$...$告诉matplotlib字符串是LaTeX,而{{...}}用大括号转义以告诉LaTeX将整个指数分组为上标。

要调整图表的限制,请执行以下操作:

ax.set_ylim([plot_data.min() - 0.5, -1])