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

3
我正在尝试设置一个反转的坐标轴条形图,使得较小的数字具有更大的条形,并且这些条形从柱状图的顶部开始。理想情况下,我的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()

在此输入图片描述

这个图表中,数字越大的条形会更宽,数字越小的则会更窄。我本想绘制每个数值与最大值之间的差别,但我希望matplotlib/pyplot中有一些内置的方法可以实现这个功能。

在matlab中,我所需要的功能是设置轴基准值:

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

你可以将条形图的高度设置为数字的负对数(不需要反转坐标轴),并为y轴设置自定义格式化程序。 - Mad Physicist
没有看到你当前的模拟数据和尝试,我无法给出更具体的答案。 - Mad Physicist
我添加了一个简单的例子,如果有帮助的话。 - Onofog
是的,谢谢你添加这个。我到桌面时会发布一个答案。你已经完成了90%的工作。我不确定数据的确切多栏排列是否是你所需要的,还是只是一个示例。 - Mad Physicist
1
我也改变了我的投票并撤回了我的关闭投票。展示你的工作非常重要。由于这个编辑,你的帖子从一个模糊的“teh codez”请求变成了一个清晰、深思熟虑的问题,我很乐意帮助你。 - Mad Physicist
1个回答

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)

你可以手动设置刻度,但我建议使用格式化器
from matplotlib.ticker import StrMethodFormatter
...
ax.yaxis.set_major_formatter(StrMethodFormatter('$10^{{{x}}}$'))

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

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

符号$...$告诉matplotlib字符串是LaTeX格式,{{...}}是转义的花括号,告诉LaTeX将整个指数作为上标分组。
要调整图表的限制:
ax.set_ylim([plot_data.min() - 0.5, -1])

这个完美地运行了,谢谢。为了其他人的利益,如果您的原始数据中有零,它将被跳过,但其他有效数据仍将被绘制。据我所知,对于分组条形图也是如此。 - Onofog
@Onofog。如果您在对数刻度上显示内容,则需要以某种方式进行零的特殊处理。很高兴Matplotlib对于NaN具有明智的默认值。 - Mad Physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接