不期望的颜色条和轴标签/情节标题互动

时间:2017-02-05 18:02:14

标签: python matplotlib colorbar

亲爱的Python用户,

我尝试通过将LinearSegmentedColormap与Imshow结合使用,使用matplotlib库来制作色彩映射,并且我很难使用实际的色条。

默认情况下,colorbar的行为方式与我想要的方式不同,也就是说,它对于我的图形来说太大了。默认情况下,我得到这个:

default colorbar

所以,我使用以下代码行来修复colorbar高度,参考this post

ax = plt.gca()
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
plt.colorbar(img2, cax=cax)

然后我得到了这个非常奇怪的结果:

fixed graph

我无法弄清楚为什么添加的代码行会与我的轴交互并绘制标题...为什么它们会使用颜色栏?

以下是完整的代码:

import matplotlib.pyplot as plt
import matplotlib.pylab  as pylab
import matplotlib.colors as colors
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable       

#random data for example
clmap = np.random.rand(30,500)

#plot 2D color map
fig = plt.figure()
cmap2 = colors.LinearSegmentedColormap.from_list('my_colormap', ['blue','green','red'], 256)
img2 = plt.imshow(clmap,interpolation='nearest',cmap = cmap2,origin='lower')
ax = plt.gca()
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
fig.colorbar(img2, cmap = cmap2, cax=cax)
plt.title('color map of atom probab at iteration 1')
plt.xlabel('atom id')
plt.ylabel('layer')
fig.savefig("map_p_1.png")
plt.gcf().clear()

1 个答案:

答案 0 :(得分:1)

您正在将pyplot状态机(plt)与面向对象的API混合使用 创建第二个轴对象(cax)后,它将成为当前轴。之后传递的所有pyplot命令都将应用于此轴。

最简单的方法是在创建新轴之前应用pyplot命令:

import matplotlib.pyplot as plt
import matplotlib.colors as colors
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable       

#random data for example
clmap = np.random.rand(30,500)

#plot 2D color map
fig = plt.figure()
plt.title('color map of atom probab at iteration 1')
plt.xlabel('atom id')
plt.ylabel('layer')
cmap2 = colors.LinearSegmentedColormap.from_list('my_colormap', ['blue','green','red'], 256)
img2 = plt.imshow(clmap,interpolation='nearest',cmap = cmap2,origin='lower')
ax = plt.gca()
divider = make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
fig.colorbar(img2, cmap = cmap2, cax=cax)

fig.savefig("map_p_1.png")

plt.show()