matplotlib colorbar 交替上下标签
matplotlib colorbar alternating top bottom labels
首先,这是一个自我回答的问题,因为我相信它在某些情况下会有帮助,例如。在 this post 中,作者试图 隐藏 每隔一个标签以避免文本重叠,一种替代方法可能是交替标签位置,以便保留所有标签并避免重叠(如果有也不是大量的标签),这就是 post 旨在解决的问题:
如何制作带有交替顶部和底部标签的 matplotlib 颜色条?
跳转到一个简单的工作示例:
import numpy
import matplotlib.pyplot as plt
#------------------Get some data------------------
X = numpy.arange(100)
Y = numpy.arange(100)
Z = numpy.arange(100**2).reshape((100,100))
levels=numpy.arange(0,100**2,1000)
ltop=levels[::2] # labels appear on top
lbot=levels[1:][::2] # labels appear at bottom
#-----------------------Plot-----------------------
f = plt.figure()
ax = f.gca()
cf = ax.contourf(X,Y,Z,100)
cbar=plt.colorbar(cf,orientation='horizontal',ticks=lbot,drawedges=True)
vmin=cbar.norm.vmin
vmax=cbar.norm.vmax
#-------------Print bottom tick labels-------------
cbar.ax.set_xticklabels(lbot)
#--------------Print top tick labels--------------
for ii in ltop:
cbar.ax.text((ii-vmin)/(vmax-vmin), 1.5, str(ii), transform=cbar.ax.transAxes, va='bottom', ha='center')
plt.show(block=False)
基本上底部的标签是使用默认方法绘制的cbar.ax.set_xticklabels(lbot)
。对于顶部标签,我使用 cbar.ax.text()
.
手动添加了它们
情节是这样的:
编辑:对我的回答的重要更新:
当colorbar有extend/overflow时,在相关端用三角形表示值溢出。在这种情况下,顶线刻度标签需要进行一些调整才能与颜色条部分正确对齐。
默认情况下,三角形大小是颜色条轴的 5%,这用于获得适当的偏移和缩放以对齐标签。
请参阅下面的示例,该示例在两端都有扩展。使用我以前的方法,结果如下所示:
顶行的 2 个端号与三角形的尖端对齐。如果只有一端有延伸,轮廓层数较多(>=10左右),错位会越来越严重。
修正后的剧情:
这是生成正确图的代码:
import numpy
import matplotlib.pyplot as plt
#------------------Get some data------------------
X = numpy.linspace(-1,1,100)
Y = numpy.linspace(-1,1,100)
X,Y=numpy.meshgrid(X,Y)
Z=numpy.sin(X**2)
levels=numpy.linspace(-0.8,0.8,9)
ltop=levels[::2] # labels appear on top
lbot=levels[1:][::2] # labels appear at bottom
#-----------------------Plot-----------------------
f = plt.figure()
ax = f.gca()
cf = ax.contourf(X,Y,Z,levels,extend='both')
cbar=plt.colorbar(cf,orientation='horizontal',ticks=lbot,drawedges=True)
#------------Compute top tick label locations------------
vmin=cbar.norm.vmin
vmax=cbar.norm.vmax
if cbar.extend=='min':
shift_l=0.05
scaling=0.95
elif cbar.extend=='max':
shift_l=0.
scaling=0.95
elif cbar.extend=='both':
shift_l=0.05
scaling=0.9
else:
shift_l=0.
scaling=1.0
#-------------Print bottom tick labels-------------
cbar.ax.set_xticklabels(lbot)
#--------------Print top tick labels--------------
for ii in ltop:
cbar.ax.text(shift_l + scaling*(ii-vmin)/(vmax-vmin),
1.5, str(ii), transform=cbar.ax.transAxes,
va='bottom', ha='center')
plt.show(block=False)
您可以添加一个双轴对象并在其中设置每个奇数刻度,同时在原始轴上设置每个偶数刻度。
import numpy as np
import matplotlib.pyplot as plt
# Make the plot
fig, ax = plt.subplots(1,1, figsize=(5,5))
fig.subplots_adjust(bottom=0.2)
## Trick to have the colorbar of the same size as the plot
box = ax.get_position()
cax = fig.add_axes([box.xmin, box.ymin - 0.1, box.width, 0.03])
m = ax.matshow(np.random.random(100).reshape(10,10), aspect="auto") # Don't forget auto or the size of the heatmap will change.
cb = plt.colorbar(m, cax=cax, orientation="horizontal")
# Add twin axes
cax2 = cax.twiny()
# get current positions and values of the ticks.
# OR you can skip this part and set your own ticks instead.
xt = cax.get_xticks()
xtl = [i.get_text() for i in cax.get_xticklabels()]
# set odd ticks on top (twin axe)
cax2.set_xticks(xt[1::2])
cax2.set_xticklabels(xtl[1::2])
# set even ticks on original axes (note the different object : cb != cax)
cb.set_ticks(xt[::2])
cb.set_ticklabels(xtl[::2])
HTH
首先,这是一个自我回答的问题,因为我相信它在某些情况下会有帮助,例如。在 this post 中,作者试图 隐藏 每隔一个标签以避免文本重叠,一种替代方法可能是交替标签位置,以便保留所有标签并避免重叠(如果有也不是大量的标签),这就是 post 旨在解决的问题:
如何制作带有交替顶部和底部标签的 matplotlib 颜色条?
跳转到一个简单的工作示例:
import numpy
import matplotlib.pyplot as plt
#------------------Get some data------------------
X = numpy.arange(100)
Y = numpy.arange(100)
Z = numpy.arange(100**2).reshape((100,100))
levels=numpy.arange(0,100**2,1000)
ltop=levels[::2] # labels appear on top
lbot=levels[1:][::2] # labels appear at bottom
#-----------------------Plot-----------------------
f = plt.figure()
ax = f.gca()
cf = ax.contourf(X,Y,Z,100)
cbar=plt.colorbar(cf,orientation='horizontal',ticks=lbot,drawedges=True)
vmin=cbar.norm.vmin
vmax=cbar.norm.vmax
#-------------Print bottom tick labels-------------
cbar.ax.set_xticklabels(lbot)
#--------------Print top tick labels--------------
for ii in ltop:
cbar.ax.text((ii-vmin)/(vmax-vmin), 1.5, str(ii), transform=cbar.ax.transAxes, va='bottom', ha='center')
plt.show(block=False)
基本上底部的标签是使用默认方法绘制的cbar.ax.set_xticklabels(lbot)
。对于顶部标签,我使用 cbar.ax.text()
.
情节是这样的:
编辑:对我的回答的重要更新:
当colorbar有extend/overflow时,在相关端用三角形表示值溢出。在这种情况下,顶线刻度标签需要进行一些调整才能与颜色条部分正确对齐。
默认情况下,三角形大小是颜色条轴的 5%,这用于获得适当的偏移和缩放以对齐标签。
请参阅下面的示例,该示例在两端都有扩展。使用我以前的方法,结果如下所示:
顶行的 2 个端号与三角形的尖端对齐。如果只有一端有延伸,轮廓层数较多(>=10左右),错位会越来越严重。
修正后的剧情:
这是生成正确图的代码:
import numpy
import matplotlib.pyplot as plt
#------------------Get some data------------------
X = numpy.linspace(-1,1,100)
Y = numpy.linspace(-1,1,100)
X,Y=numpy.meshgrid(X,Y)
Z=numpy.sin(X**2)
levels=numpy.linspace(-0.8,0.8,9)
ltop=levels[::2] # labels appear on top
lbot=levels[1:][::2] # labels appear at bottom
#-----------------------Plot-----------------------
f = plt.figure()
ax = f.gca()
cf = ax.contourf(X,Y,Z,levels,extend='both')
cbar=plt.colorbar(cf,orientation='horizontal',ticks=lbot,drawedges=True)
#------------Compute top tick label locations------------
vmin=cbar.norm.vmin
vmax=cbar.norm.vmax
if cbar.extend=='min':
shift_l=0.05
scaling=0.95
elif cbar.extend=='max':
shift_l=0.
scaling=0.95
elif cbar.extend=='both':
shift_l=0.05
scaling=0.9
else:
shift_l=0.
scaling=1.0
#-------------Print bottom tick labels-------------
cbar.ax.set_xticklabels(lbot)
#--------------Print top tick labels--------------
for ii in ltop:
cbar.ax.text(shift_l + scaling*(ii-vmin)/(vmax-vmin),
1.5, str(ii), transform=cbar.ax.transAxes,
va='bottom', ha='center')
plt.show(block=False)
您可以添加一个双轴对象并在其中设置每个奇数刻度,同时在原始轴上设置每个偶数刻度。
import numpy as np
import matplotlib.pyplot as plt
# Make the plot
fig, ax = plt.subplots(1,1, figsize=(5,5))
fig.subplots_adjust(bottom=0.2)
## Trick to have the colorbar of the same size as the plot
box = ax.get_position()
cax = fig.add_axes([box.xmin, box.ymin - 0.1, box.width, 0.03])
m = ax.matshow(np.random.random(100).reshape(10,10), aspect="auto") # Don't forget auto or the size of the heatmap will change.
cb = plt.colorbar(m, cax=cax, orientation="horizontal")
# Add twin axes
cax2 = cax.twiny()
# get current positions and values of the ticks.
# OR you can skip this part and set your own ticks instead.
xt = cax.get_xticks()
xtl = [i.get_text() for i in cax.get_xticklabels()]
# set odd ticks on top (twin axe)
cax2.set_xticks(xt[1::2])
cax2.set_xticklabels(xtl[1::2])
# set even ticks on original axes (note the different object : cb != cax)
cb.set_ticks(xt[::2])
cb.set_ticklabels(xtl[::2])
HTH