【发布时间】: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