多个子图右侧的独特颜色条
Unique colorbar at the right of multiple subplots
我正在尝试向一组 2x2 子图中添加一个独特的颜色条,我希望它位于整体的右侧。正如您在代码的最后几行中看到的那样,我已经能够生成颜色条,但结果是它出现在最后一个面板的右侧(见下图)。有人可以帮我找到解决方案吗?
import os
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
import pandas as pd
mark=['-o','-s','-o','-^','-s']
Axs=['ax1','ax2','ax3','ax4']
RadiLabel=['5','7','10','15']
Lambda=np.arange(10,20,1)
print(Lambda[:])
Num_Colors=int(len(Lambda))
print(Num_Colors)
cm = plt.get_cmap('viridis_r')
# viridis,plasma,inferno,magma,gist_rainbow,gnuplot,autumn,Blues
mpl.rcParams['xtick.direction'] = 'in'
mpl.rcParams['ytick.direction'] = 'in'
mpl.rcParams['xtick.major.size'] = 15
mpl.rcParams['xtick.minor.size'] = 5
mpl.rcParams['ytick.major.size'] = 15
mpl.rcParams['ytick.minor.size'] = 5
mpl.rcParams['font.family'] = 'Calibri'
fig = plt.figure(figsize=(12,9))
#fig.subplots_adjust(right=0.8)
ax=fig.add_subplot(111)
ax.set_title('Area', fontsize=20)
plt.axis([0.8,15.2, 0.,0.3])
File= 'SCAli.txt'
data=np.loadtxt(File)
dat=pd.read_fwf("SCAli.txt",header=None,names=["Area","R","L","H"])
k=0
#print(len(Axs))
for j in range(0,len(Axs)):
k=k+1
axes=Axs[j]=plt.subplot(2,2,k)
Axs[j].set_prop_cycle(color=[cm(1.*ii/Num_Colors) for ii in range(Num_Colors)])
Axs[j].annotate('R= '+RadiLabel[j]+' nm', xy=(0.07, 0.9), xycoords="axes fraction",fontsize=20)
for i in Lambda:
dat2=dat.loc[(dat['L'] == i) & (dat['R'] == Radi[j])]
Axs[j].plot(dat2['H'],dat2['Area'],mark[0],markersize=10,markeredgecolor='black',lw=2)
plt.xlabel("Height", fontsize=30)
plt.ylabel("Area", fontsize=30)
plt.xticks(fontsize=20, rotation=0)
plt.yticks(fontsize=20, rotation=0)
Axs[j].minorticks_off()
plt.tight_layout()
# Here we plot the colorbar
sm = plt.cm.ScalarMappable(cmap=cm, norm=plt.Normalize(vmin=1, vmax=2))
cbar=plt.colorbar(sm)
cbar.ax.tick_params(labelsize=20)
cbar.set_label('$\lambda$',size=20)
plt.show()
plt.close()
我找到了问题的答案。经过一些尝试和查看类似示例后,我意识到添加以下代码行就足够了:
plt.subplots_adjust(bottom=0., right=0.92, top=1.)
cax = plt.axes([0.95, 0.3, 0.025, 0.4])
sm = plt.cm.ScalarMappable(cmap=cm, norm=plt.Normalize(vmin=1, vmax=2))
cbar=plt.colorbar(sm,cax)
- 第一个命令通过将 right=1. 更改为 right=0.92 将四个子图调整到左侧,留下 space 颜色条放置在它们的右侧。
- 第二个命令生成新的图形轴以填充颜色条。这些数字对应一个具有以下特征的矩形区域[left, bottom, width, height],这样colorbar可以在宽度、位置和长度上变化。
- 然后,第 4 个命令使用颜色图 cm 绘制颜色条,将颜色映射到第 3 个命令作为 st 的子面板中使用的颜色,并使用坐标轴 cax。
结果如下图:
Solution
我正在尝试向一组 2x2 子图中添加一个独特的颜色条,我希望它位于整体的右侧。正如您在代码的最后几行中看到的那样,我已经能够生成颜色条,但结果是它出现在最后一个面板的右侧(见下图)。有人可以帮我找到解决方案吗?
import os
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib import cm
import pandas as pd
mark=['-o','-s','-o','-^','-s']
Axs=['ax1','ax2','ax3','ax4']
RadiLabel=['5','7','10','15']
Lambda=np.arange(10,20,1)
print(Lambda[:])
Num_Colors=int(len(Lambda))
print(Num_Colors)
cm = plt.get_cmap('viridis_r')
# viridis,plasma,inferno,magma,gist_rainbow,gnuplot,autumn,Blues
mpl.rcParams['xtick.direction'] = 'in'
mpl.rcParams['ytick.direction'] = 'in'
mpl.rcParams['xtick.major.size'] = 15
mpl.rcParams['xtick.minor.size'] = 5
mpl.rcParams['ytick.major.size'] = 15
mpl.rcParams['ytick.minor.size'] = 5
mpl.rcParams['font.family'] = 'Calibri'
fig = plt.figure(figsize=(12,9))
#fig.subplots_adjust(right=0.8)
ax=fig.add_subplot(111)
ax.set_title('Area', fontsize=20)
plt.axis([0.8,15.2, 0.,0.3])
File= 'SCAli.txt'
data=np.loadtxt(File)
dat=pd.read_fwf("SCAli.txt",header=None,names=["Area","R","L","H"])
k=0
#print(len(Axs))
for j in range(0,len(Axs)):
k=k+1
axes=Axs[j]=plt.subplot(2,2,k)
Axs[j].set_prop_cycle(color=[cm(1.*ii/Num_Colors) for ii in range(Num_Colors)])
Axs[j].annotate('R= '+RadiLabel[j]+' nm', xy=(0.07, 0.9), xycoords="axes fraction",fontsize=20)
for i in Lambda:
dat2=dat.loc[(dat['L'] == i) & (dat['R'] == Radi[j])]
Axs[j].plot(dat2['H'],dat2['Area'],mark[0],markersize=10,markeredgecolor='black',lw=2)
plt.xlabel("Height", fontsize=30)
plt.ylabel("Area", fontsize=30)
plt.xticks(fontsize=20, rotation=0)
plt.yticks(fontsize=20, rotation=0)
Axs[j].minorticks_off()
plt.tight_layout()
# Here we plot the colorbar
sm = plt.cm.ScalarMappable(cmap=cm, norm=plt.Normalize(vmin=1, vmax=2))
cbar=plt.colorbar(sm)
cbar.ax.tick_params(labelsize=20)
cbar.set_label('$\lambda$',size=20)
plt.show()
plt.close()
我找到了问题的答案。经过一些尝试和查看类似示例后,我意识到添加以下代码行就足够了:
plt.subplots_adjust(bottom=0., right=0.92, top=1.)
cax = plt.axes([0.95, 0.3, 0.025, 0.4])
sm = plt.cm.ScalarMappable(cmap=cm, norm=plt.Normalize(vmin=1, vmax=2))
cbar=plt.colorbar(sm,cax)
- 第一个命令通过将 right=1. 更改为 right=0.92 将四个子图调整到左侧,留下 space 颜色条放置在它们的右侧。
- 第二个命令生成新的图形轴以填充颜色条。这些数字对应一个具有以下特征的矩形区域[left, bottom, width, height],这样colorbar可以在宽度、位置和长度上变化。
- 然后,第 4 个命令使用颜色图 cm 绘制颜色条,将颜色映射到第 3 个命令作为 st 的子面板中使用的颜色,并使用坐标轴 cax。
结果如下图: Solution