我正在尝试设置一个倒置的轴条形图,以便较小的数字具有较大的条形,并且这些条形从条形图的顶部开始。理想情况下,我的y轴从底部的10e-10到顶部的10e-2不等,看起来类似于以下excel图:
在呈现此数据时,将数字降低是更好的选择,所以我希望用更大的条形来表示,而不是没有条形。
反转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()
结果图具有较大的条形,表示较大的数字,较小的条形图,表示较小的数字。相反,我可以绘制每个值与最大值之间的差异,但我希望在matplotlib / pyplot中有一些内置的方法可以实现这一点。
使用matlab,我正在寻找的功能是设置轴基准值:
b = bar(ticks, barValues);
b(1).BaseValue = 1e0;
答案 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])