用双刻度绘制彩条

时间:2014-11-26 14:01:39

标签: matplotlib colorbar

我想绘制一个(垂直)颜色条,每个颜色条有两个不同的比例(对应于相同数量的两个不同单位)。一边是华氏,另一边是摄氏。显然,我需要单独指定每一方的刻度。

知道我该怎么做吗?

3 个答案:

答案 0 :(得分:10)

这应该让你开始:

import matplotlib.pyplot as plt
import numpy as np

# generate random data
x = np.random.randint(0,200,(10,10))
plt.pcolormesh(x)

# create the colorbar
# the aspect of the colorbar is set to 'equal', we have to set it to 'auto',
# otherwise twinx() will do weird stuff.
cbar = plt.colorbar()
pos = cbar.ax.get_position()
cbar.ax.set_aspect('auto')

# create a second axes instance and set the limits you need
ax2 = cbar.ax.twinx()
ax2.set_ylim([-2,1])

# resize the colorbar (otherwise it overlays the plot)
pos.x0 +=0.05
cbar.ax.set_position(pos)
ax2.set_position(pos)

plt.show()

enter image description here

答案 1 :(得分:5)

如果为色条创建子图,则可以为该子图创建双轴并像普通轴一样对其进行操作。

import matplotlib.colors as mcolors
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-1,2.7)
X,Y = np.meshgrid(x,x)
Z = np.exp(-X**2-Y**2)*.9+0.1

fig, (ax, cax) = plt.subplots(ncols=2, gridspec_kw={"width_ratios":[15,1]})

im =ax.imshow(Z, vmin=0.1, vmax=1)
cbar = plt.colorbar(im, cax=cax)
cax2 = cax.twinx()

ticks=np.arange(0.1,1.1,0.1)
iticks=1./np.array([10,3,2,1.5,1])
cbar.set_ticks(ticks)
cbar.set_label("z")
cbar.ax.yaxis.set_label_position("left")
cax2.set_ylim(0.1,1)
cax2.set_yticks(iticks)
cax2.set_yticklabels(1./iticks)
cax2.set_ylabel("1/z")

plt.show()

enter image description here

答案 2 :(得分:0)

我正在为我的颜色条使用插入轴,并且由于某种原因,我发现上述答案从 v3.4.2 开始不再有效。 twinx 占据了整个原始子图。

所以我只是复制了插入轴(而不是使用 twinx)并增加了原始插入的 zorder。

axkws = dict(zorder=2)
cax = inset_axes(
    ax, width="100%", height="100%", bbox_to_anchor=bbox, 
    bbox_transform=ax.transAxes, axes_kwargs=axkws
)
cbar = self.fig.colorbar(mpl.cm.ScalarMappable(cmap=cmap), cax=cax)
cbar.ax.yaxis.set_ticks_position('left')
    
caxx = inset_axes(
    ax, width="100%", height="100%", 
    bbox_to_anchor=bbox, bbox_transform=ax.transAxes
)
caxx.yaxis.set_ticks_position('right')