【问题标题】:matplotlib prune tick labelsmatplotlib 修剪刻度标签
【发布时间】:2015-01-12 20:21:51
【问题描述】:

我正在使用 GridSpec 绘制两个图,一个在另一个之下,而在两者之间没有间隙

gs = gridspec.GridSpec(3, 1)
gs.update(hspace=0., wspace=0.)
ax1 = plt.subplot(gs[0:2, 0])
ax2 = plt.subplot(gs[2, 0], sharex=ax1)

效果很好。但是,我想摆脱每个子图的顶部和底部刻度标签。 为此我使用

nbins = len(ax1.get_yticklabels())
ax1.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='both'))
nbins = len(ax2.get_yticklabels())
ax2.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='both'))

在许多情况下都可以正常工作。然而,在某些地块中,要修剪的 4 个标签中的一个或多个仍然存在。我看着例如ax1.get_ylim() 并注意到例如上限不是10(如图所示),实际上是10.000000000000002,我怀疑这是它没有被修剪的原因。这是怎么发生的,我怎样才能摆脱它?

这是一个示例:请注意,图中的 y 轴是倒置的,并且没有修剪任何标签,尽管应该如此。另请注意,由于某种原因,最低的 y 标签设置为负位置,我没有看到。 y 刻度位置显示在图中文本的轴坐标中。在下图中,10.6 的标签不应该在那里!

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from matplotlib.ticker import MaxNLocator
import numpy as np

x1 = 1
y1 = 10.53839
err1 = 0.00865
x2 = 2
y2 = 9.43045
err2 = 0.00658

plt.clf()
fig = plt.figure(figsize=(6, 6))
gs = gridspec.GridSpec(3, 1)
gs.update(hspace=0., wspace=0.)
ax1 = plt.subplot(gs[0:2, 0])

ax1.errorbar(x1, y1, yerr=err1)
ax1.errorbar(x2, y2, yerr=err2)

ax1.invert_yaxis()

plt.setp(ax1.get_xticklabels(), visible=False)  # Remove x-labels between the plots
plt.xlim(0, 3)

ax2 = plt.subplot(gs[2, 0], sharex=ax1)

nbins = len(ax1.get_yticklabels())
ax1.yaxis.set_major_locator(MaxNLocator(nbins=8, prune='both'))
nbins = len(ax2.get_yticklabels())
ax2.yaxis.set_major_locator(MaxNLocator(nbins=6, prune='both'))

plt.savefig('prune.png')
plt.close()

【问题讨论】:

  • 从你的问题来看,听起来你想要有相同的 x 轴,所以根本没有刻度标签,在下面的答案中涵盖,然后你只想修剪更低和upper,分别用于上图和下图。这是一个准确的解释吗?
  • 没错,x轴就好了。我想设置 y-ticks 的数量(在上面的示例中 nbins,),然后我想修剪上下值,如果它位于轴的(下或上)端。
  • 我无法重现该错误。使用您提供的代码(包括下面我的答案中的行),一切都对我来说应该是正常的。你能提供一个说明问题的例子吗?
  • 是的,我会尝试做一个最小的例子并回复你。
  • 我现在看到了问题。但是,您的示例仍然很大。您能否尝试删除与问题无关的所有内容?

标签: python matplotlib labels


【解决方案1】:

有没有可能,您正在查看上图 x 轴上最左侧的标签?如果是这样,这应该可以解决问题:

ax1.set_xticklabels([])

编辑:如果你使用sharex,你必须使用这个,否则两个轴上的刻度标签都会被删除。

plt.setp(ax1.get_xticklabels(), visible=False)

【讨论】:

  • 不,我不在两个图之间使用任何 x 标签,因此hspace=0. prune 应该做的是修剪最高和最低刻度标签,如果它位于任一端y 轴的。但在许多情况下,它并没有这样做。
  • 从您的代码中不清楚,您已经删除了 x 刻度标签。
  • 是的,我明白了,对此感到抱歉。然而,对于剪枝问题,x 轴并不重要。
  • 谢谢,我知道,这当然是我一直在使用的。我编辑了问题以包含一个示例。
【解决方案2】:

你可以试试这个:

import matplotlib.ticker as mticker

ax2.yaxis.set_major_locator(mticker.MaxNLocator(nbins=7, prune='upper'))

我发现上面的命令只适用于 y 轴。

有人知道如何设置 x 轴代码数量的最大限制吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2014-08-03
    • 2017-01-07
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多