【问题标题】:Have no spaces between bars in matplotlib bar graphmatplotlib条形图中的条之间没有空格
【发布时间】:2020-02-26 22:33:34
【问题描述】:

我希望我的结果图看起来像一个直方图,条形之间完全没有空格。我正在使用 matplotlib 的 axes.bar()。我查看了文档,但我从那里尝试过的没有任何帮助(设置 pad=0,设置 xticks)。我希望每个条的宽度 = 0.1,因为这是刻度之间间隔的大小,我想完全填充图表。

这是我的代码

colors = self.data[index].colors # a list of the color each bar should have
depth = self.data[index].depth # the depth in meters, increases by set interval (0.1)
data = np.ones(len(cluster_labels))
axis.bar(x=depth, height=data, color=colors, width=0.1, align='edge')
axis.tick_params(axis='x', pad=0)
axis.get_xaxis().set_visible(True)
axis.get_yaxis().set_visible(True)
axis.set_xlim(xmin=self.ruler_pix_to_m(idx_begin), xmax=self.ruler_pix_to_m(idx_end))
axis.set_ylim(ymin=0, ymax=1)
axis.set_axis_on()

我得到的图表是:

我想要的是一个图表,我能看到的只有条形图,从刻度 2.2 到刻度 16.78,如下所示:

如何指定条形之间完全没有空间?如果 matplotlib 条形图不起作用,还有其他方法可以获得我想要的绘图类型吗?任何帮助将不胜感激!

更新:我摆脱了辅助轴并更改了宽度 = 1,现在图表如下所示:

但是,我不希望图表末尾的空白,但尝试使用 .set_xlim(xmin=x_start, xmax=x_end) 会导致以下结果:

如您所见,x 轴完全弄乱了我使用的 x 限制是条形图 x 轴中的第一个和最后一个数据点,所以我不确定是什么导致范围变得如此小。

【问题讨论】:

  • 由于您似乎是 Stack Overflow 的新手,您应该阅读How to create a Minimal, Complete, and Verifiable example
  • 您似乎有 2 个 x 轴。而且您似乎是通过顶轴的轴坐标指定宽度。对于该轴,您需要宽度=1。显示的输出似乎不是来自显示的代码。顺便说一句,您可以使用axis.tick_params(axis='x', length=0) 隐藏刻度。如果条形高度是恒定的,那么只写axis.bar(..., height=1, ...) 会更具可读性。
  • 嗨 JohanC,非常感谢您的回复,我的第二个轴是我添加的辅助轴,您能解释一下该轴需要 width=1 是什么意思吗?此外,我将尝试提供一个可运行的示例。
  • 因为这个代码是一个更大的 sn-p 的一部分,我不知道如何绘制 matplotlib.figure.Figure 对象来准确地重现这个(我在 tkinter 画布中显示这个图) matplotlib.figure.Figure() 和 matplotlib.pyplot 有很大区别吗?
  • 好吧,只需在对 bar 的调用中将宽度设置为 0。您的axis.bar 已以axis 为顶轴绘制。

标签: python matplotlib


【解决方案1】:

如果您想使用 matplotlib 创建直方图,您可能应该使用 plt.hist(),如果您将参数 rwidth 指定为 1.0,则生成的图将在条形之间没有垂直间隙。

【讨论】:

  • 我不能使用 .hist() 因为我希望每个条有不同的颜色,我尝试了 width=1 但我希望底部轴与顶部轴匹配(它们应该相同),据我了解,width=1 会使条形图的间隔为 1,但我希望间隔为 0.1