【问题标题】:Subplot with custom colorbar range from group of plots带有自定义颜色条范围的子图,来自一组图
【发布时间】:2017-09-24 16:13:33
【问题描述】:

我想为该组绘制一组带有颜色条的等高线图。由于颜色条取决于您在 ax 参数中指定的子图,因此颜色条的范围并不反映前 2 列中所有图的值的范围。

我能否指定第一个颜色条(左侧)以反映刻度上的最小 (mina=-500) 和最大 (maxa=500) 值?

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
v = np.arange(-180,181,15)
y,x = np.meshgrid(v,v)

p1 = 500*np.sin(x+y)
p2 = x
p3 = -500*np.sin(3*x+y)
p4 = y
p5 = -200*np.cos(x+5*y)
p6 = 100*np.cos(x+6*y)

f, ax = plt.subplots(2,3,sharex='row',sharey='col',figsize=(4,6))

mina = min(min(p1.reshape(625,)),min(p2.reshape(625,)),min(p3.reshape(625,)),min(p4.reshape(625,)))
maxa = max(max(p1.reshape(625,)),max(p2.reshape(625,)),max(p3.reshape(625,)),max(p4.reshape(625,)))
minb = min(min(p5.reshape(625,)),min(p6.reshape(625,)))
maxb = max(max(p5.reshape(625,)),max(p6.reshape(625,)))

ax[0,0].contourf(x,y,p1,20,vmin=mina,vmax=maxa)
ax[0,0].set(adjustable='box-forced', aspect='equal')
l0 = ax[1,0].contourf(x,y,p2,20,vmin=mina,vmax=maxa)
ax[1,0].set(adjustable='box-forced', aspect='equal')
ax[0,1].contourf(x,y,p3,20,vmin=mina,vmax=maxa)
ax[0,1].set(adjustable='box-forced', aspect='equal')
ax[1,1].contourf(x,y,p4,20,vmin=mina,vmax=maxa)
ax[1,1].set(adjustable='box-forced', aspect='equal')
ax[0,2].contourf(x,y,p5,20,vmin=minb,vmax=maxb)
ax[0,2].set(adjustable='box-forced', aspect='equal')
l1 = ax[1,2].contourf(x,y,p6,20,vmin=minb,vmax=maxb)
ax[1,2].set(adjustable='box-forced', aspect='equal')

f.colorbar(l0, ax=list(ax[1,0:2]),orientation='horizontal', pad=0.2)
f.colorbar(l1, ax=ax[1,2],orientation='horizontal', aspect=10, pad=0.2)

plt.setp([a.get_xticklabels() for a in ax[0,:]], visible=False)
plt.setp([a.get_yticklabels() for a in ax[:,1]], visible=False)
plt.setp([a.get_yticklabels() for a in ax[:,2]], visible=False)

plt.show()

【问题讨论】:

  • 这不是通过设置mina = minb = -500maxa = maxb = 500来实现的吗?
  • 规范说前2列有一个颜色条,最后一列有另一个。另外,mina != minbmaxa != maxb。然而,这并不能解决问题,因为颜色条范围刻度遵循指定的等高线图。
  • 规范究竟是什么?如果您具体了解每个子图的确切限制应该是什么以及两个颜色条中的每个限制是什么,我们可以找到解决方案。
  • 我编辑了这篇文章。基本上,左侧颜色条需要反映四个图的全部范围(在前 2 列上),即根据所有四个图的最小值和最大值反映刻度上的最小值和最大值。这就是我为左侧颜色条计算 minamaxa 的原因。

标签: python matplotlib subplot colorbar


【解决方案1】:

我认为在这种情况下解决方案很简单:将第一个图用作颜色条的 ScalarMappable

l0 = ax[0,0].contourf(x,y,p1,20,vmin=mina,vmax=maxa)
#...
l1 = ax[0,2].contourf(x,y,p5,20,vmin=minb,vmax=maxb)
#...

在更一般的情况下,一个图可能包含最小值而另一个图包含最大值,解决方案是专门为颜色条创建一个 ScalarMappable。

sm = plt.cm.ScalarMappable(cmap="viridis", norm=plt.Normalize(vmin=mina, vmax=maxa))
sm.set_array([])
f.colorbar(sm, ax=list(ax[1,0:2]),orientation='horizontal', pad=0.2)

【讨论】:

    猜你喜欢
    • 2015-05-14
    • 2018-07-21
    • 2019-11-09
    • 1970-01-01
    • 2019-11-07
    • 2012-03-08
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多