【问题标题】:Why minor ticks disappear on pylab subplots为什么 pylab 子图上的小刻度会消失
【发布时间】:2013-08-14 06:55:19
【问题描述】:

开始编辑

在最初的帖子之后,我继续使用我的代码。在我的子图中,我制作了相同数据集的四个图,每个子图都有不同的时间范围。但是,如果我给每个子图相同的时间范围,那么次要刻度不会消失。这可能是 Deditos 无法重现我的问题的原因。

话虽如此,如果我手动创建每个子图(每个子图都有不同的 x 轴范围),设置次要刻度位置,然后设置每个子图的 xrange 在我设置 ax3 之前,我看不到次要刻度消失(即最后一个子图)范围。

似乎问题在于具有不同的 x 轴范围。奇怪的是,我认为通过单独设置每个轴的属性,它们不会全部绑定在一起。

结束编辑

我正在创建一个具有四个子图的图形,所有子图都是时间序列。我每四个小时间隔一次 xaxis 主要滴答声,并且希望每小时都有次要滴答声。当我为第一个子图(称为 ax1)设置次要刻度时,次要刻度会出现,因为它们应该。但是,当我在 ax2 中设置次要刻度时,它们会出现在 ax2 中,但在 ax1 中的次要刻度消失了。这对 ax3 和 ax4 重复。所以,最后我在第四个子图中只有次要的 xaxis 刻度。我在 yaxis 上遇到了同样的问题,但使用 yaxis.set_minor_locator(MultipleLocator(5)) 解决了这个问题(见下文)。但是,MultipleLocator 似乎不适用于时间序列数据。有谁知道我怎样才能保持我的次要 xaxis 刻度?

from pylab import *
from matplotlib.ticker import AutoMinorLocator, MultipleLocator
minor = AutoMinorLocator()

# Start plotting
fig = figure( figsize=(22,11) )
ax1 = fig.add_subplot(221) # 8-August 2011
ax2 = fig.add_subplot(222) # 9-August 2011
ax3 = fig.add_subplot(223) # 23-August 2011
ax4 = fig.add_subplot(224) # 24-August 2011

# This is repeated for ax2, ax3, and ax4, yielding a 2x2 grid of subplots. 

# Plot 8-August 2011 data
ax1.plot(tpan.index,tpan.no2,'.-',markersize=10)
ax1.errorbar(tacam.index,tacam.no2,yerr=0.15,fmt='r.',markersize=12)

# Format plots
suptitle('Pandora/ACAM NO$_2$ Comparison', fontsize=22)

# Define xtick locations/string labels
xtickloc = [dt.datetime.combine(dates[0],dt.time())+dt.timedelta(hours=h) for h in range(0,25,4)]
xticklab = [dt.datetime.strftime(h,'%H:%M') for h in xtickloc]

ax1.set_xlabel('Hour of Day (UTC, EST+5)',fontsize=14)
ax1.set_ylabel('NO$_2$ Column Density (molec*cm$^{-2}$ E16)',fontsize=14)
ax1.xaxis.set_ticks(xtickloc)
ax1.yaxis.set_ticks(linspace(0,1.5,7))
ax1.xaxis.set_minor_locator(minor)
ax1.yaxis.set_minor_locator(MultipleLocator(5))
ax1.set_xticklabels(xticklab,fontsize=12,fontweight='bold')
ax1.set_yticklabels(linspace(0,1.5,7),fontsize=12,fontweight='bold')
ax1.axis( (dates[0],dates[0]+dt.timedelta(days=1),-0.05,1.5),fontsize=6,fontweight='bold')
ax1.tick_params(which='both',width=2,top='on')
ax1.tick_params(which='major',length=7)
ax1.tick_params(which='minor',length=4)
ax1.grid(linestyle='-',which='major',linewidth=1)
ax1.set_title('08-August 2011',fontsize=16)
ax1.legend( ('Pandora VCD','ACAM dSCD'),loc=2,ncol=2)

【问题讨论】:

  • 我无法从您的代码中重现您的问题 - 所有四个子图都是用小勾号绘制的。 (Python 2.7,Matplotlib 1.0.1)。
  • 有趣。我的仍然只显示最后一个子图上的刻度。我将我的标签从 matplotlib 更改为 pylab(我应该说我尝试更改标签,但更改并没有保存......),因为我使用 pylab 进行绘图,但我不认为这应该做那么多的区别。你能确认你是导入pylab还是matplotlib?
  • 仅供参考:我正在使用 pylab 1.7.1 并拥有 matplotlib 1.2.1
  • 我按照你的脚本导入了 pylab。当然,我必须猜测datestpan.indextpan.no2 等的类型,以及您为每个ax 实例重复的语句。这些决定可能是相关的。
  • tpan 是一个熊猫数据框; tpan.index 是日期时间; tpan.no2 是双打;我已经用更多细节更新了我的原始帖子。基本上,我创建了四次相同的情节,然后调整x轴的时间范围,其他一切都一样。

标签: python-2.7 matplotlib


【解决方案1】:

我也遇到了同样的问题。我认为你需要做的是:

ax1.xaxis.set_minor_locator(AutoMinorLocator())

而不是

ax1.xaxis.set_minor_locator(minor)

您将相同的对象传递给每个轴。当您根据该子图上的范围在 ax4 上绘图时,此对象的内容会被修改。希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    相关资源
    最近更新 更多