Matplotlib:带有第二个 y 轴的 imshow

Posted

技术标签:

【中文标题】Matplotlib:带有第二个 y 轴的 imshow【英文标题】:Matplotlib: imshow with second y axis 【发布时间】:2018-06-23 15:51:50 【问题描述】:

我正在尝试使用 imshow() 在 matplotlib 中绘制一个二维数组,并在第二个 y 轴上用散点图覆盖它。

oneDim = np.array([0.5,1,2.5,3.7])
twoDim = np.random.rand(8,4)

plt.figure()
ax1 = plt.gca()

ax1.imshow(twoDim, cmap='Purples', interpolation='nearest')
ax1.set_xticks(np.arange(0,twoDim.shape[1],1))
ax1.set_yticks(np.arange(0,twoDim.shape[0],1))
ax1.set_yticklabels(np.arange(0,twoDim.shape[0],1))
ax1.grid()

#This is the line that causes problems
ax2 = ax1.twinx()

#That's not really part of the problem (it seems)
oneDimX = oneDim.shape[0]
oneDimY = 4
ax2.plot(np.arange(0,oneDimX,1),oneDim)
ax2.set_yticks(np.arange(0,oneDimY+1,1))
ax2.set_yticklabels(np.arange(0,oneDimY+1,1))

如果我只将所有内容运行到最后一行,我的数组就会完全可视化:

但是,如果我添加第二个 y 轴 (ax2=ax1.twinx()) 作为散点图的准备,它会变为这种不完整的渲染:

有什么问题?我在上面的代码中留下了几行描述散点图的添加,尽管它似乎不是问题的一部分。

【问题讨论】:

在 Python 2.7、matplotlib 2.1.1 上转载。这很可能是一个错误 这里有一个类似的系统:Python 2.7.12,Matplotlib 2.1.1。 @DavidG 如果这被证明是一个错误,是否有任何解决方法可以用两个 y 轴实现这个覆盖? 在这个问题上有一个discussion on github。显然它与imshow 强制ax1 的纵横比有关。如果你设置ax1.set_aspect('auto')整个图像,绘图将正确显示,但图像会严重失真。 【参考方案1】:

在 Thomas Kuehn 指出的 GitHub 讨论之后,该问题已在几天前得到解决。在没有现成的构建的情况下,这里使用 aspect='auto' 属性进行修复。为了得到漂亮的常规框,我使用数组维度调整了图形 x/y。轴自动缩放功能已用于删除一些额外的白色边框。

oneDim = np.array([0.5,1,2.5,3.7])
twoDim = np.random.rand(8,4)

plt.figure(figsize=(twoDim.shape[1]/2,twoDim.shape[0]/2))
ax1 = plt.gca()

ax1.imshow(twoDim, cmap='Purples', interpolation='nearest', aspect='auto')
ax1.set_xticks(np.arange(0,twoDim.shape[1],1))
ax1.set_yticks(np.arange(0,twoDim.shape[0],1))
ax1.set_yticklabels(np.arange(0,twoDim.shape[0],1))
ax1.grid()

ax2 = ax1.twinx()

#Required to remove some white border
ax1.autoscale(False)
ax2.autoscale(False)

结果:

【讨论】:

以上是关于Matplotlib:带有第二个 y 轴的 imshow的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib 在所有子图上显示 x-ticks 和唯一的 y 标签

如何使用 matplotlib 更改 y 轴的比例? [复制]

如何使用Figure(matplotlib FigureCanvasQTAgg)绘制具有多个y轴的共享x轴子图?

4.13Python数据处理篇之Matplotlib系列(十三)---轴的设置

echarts 怎么让y轴在 x轴的中间

matplotlib的基础绘图和调整x轴的刻度