Skip to main content
 首页 » 编程设计

python之绘制颜色条时强制方形子图

2025年05月04日16xing901022

我正在尝试并排生成两个子图,共享 y 轴,两个子图都使用一个颜色条。

这是我的代码的 MWE:

import matplotlib.pyplot as plt 
import numpy as np 
 
def rand_data(l, h): 
    return np.random.uniform(low=l, high=h, size=(100,)) 
 
# Generate data. 
x1, x2, y, z = rand_data(0., 1.), rand_data(100., 175.), \ 
rand_data(150., 200.), rand_data(15., 33.) 
 
fig = plt.figure() 
cm = plt.cm.get_cmap('RdYlBu') 
 
ax0 = plt.subplot(121) 
plt.scatter(x1, y, c=z, cmap=cm) 
 
ax1 = plt.subplot(122) 
# make these y tick labels invisible 
plt.setp(ax1.get_yticklabels(), visible=False) 
plt.scatter(x2, y, c=z, cmap=cm) 
 
cbar = plt.colorbar() 
plt.show() 

返回的是左侧子图在水平方向上比右侧子图略大,因为最后一个子图包含颜色条,见下文:

我试过使用 ax.set_aspect('equal') 但由于 x 轴不在同一范围内,结果看起来很糟糕。

我需要将这两个图都显示为正方形。我该怎么做?

请您参考如下方法:

为了扩展我的评论,即可以制作 3 个图,请在第 3 个中绘制 colorbar(),在第 1 个和第 2 个中绘制数据图。这样,如有必要,我们可以自由地对第一个和第二个图做任何我们想做的事情:

def rand_data(l, h): 
    return np.random.uniform(low=l, high=h, size=(100,)) 
 
# Generate data. 
x1, x2, y, z = rand_data(0., 1.), rand_data(100., 175.), \ 
rand_data(150., 200.), rand_data(15., 33.) 
 
fig = plt.figure(figsize=(12,6)) 
gs=gridspec.GridSpec(1,3, width_ratios=[4,4,0.2]) 
ax1 = plt.subplot(gs[0]) 
ax2 = plt.subplot(gs[1]) 
ax3 = plt.subplot(gs[2]) 
cm = plt.cm.get_cmap('RdYlBu') 
ax1.scatter(x1, y, c=z, cmap=cm) 
SC=ax2.scatter(x2, y, c=z, cmap=cm) 
plt.setp(ax2.get_yticklabels(), visible=False) 
plt.colorbar(SC, cax=ax3) 
plt.tight_layout() 
plt.savefig('temp.png')