Python 打印颜色栏时强制使用方形子图

Python 打印颜色栏时强制使用方形子图,python,matplotlib,plot,subplot,colorbar,Python,Matplotlib,Plot,Subplot,Colorbar,我试图并排生成两个子图,共享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.), \ ra

我试图并排生成两个子图,共享
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\u aspect('equal')
,但由于
x
轴不在同一范围内,结果看起来很糟糕


我需要这两个图都显示为正方形。我如何才能做到这一点?

更新-这里是另一个不使用GridSpec的选项

import numpy as np
import matplotlib.pyplot as plt

N = 50
x_vals = np.random.rand(N)
y_vals = np.random.rand(N)
z1_vals = np.random.rand(N)
z2_vals = np.random.rand(N)

minimum_z = min(np.min(z1_vals), np.min(z2_vals))
maximum_z = max(np.max(z1_vals), np.max(z2_vals))

fig, axis_array = plt.subplots(1,2, figsize = (20, 10), subplot_kw = {'aspect':1})
ax0 = axis_array[0].scatter(x_vals, y_vals, c = z1_vals, s = 100, cmap = 'rainbow', vmin = minimum_z, vmax = maximum_z)
ax1 = axis_array[1].scatter(x_vals, y_vals, c = z2_vals, s = 100, cmap = 'rainbow', vmin = minimum_z, vmax = maximum_z)

cax = fig.add_axes([0.95, 0.05, 0.02, 0.95]) #this locates the axis that is used for your colorbar. It is scaled 0 - 1. 
fig.colorbar(ax0, cax, orientation = 'vertical') #'ax0' tells it which plot to base the colors on

plt.show()


更新-这里是另一个不使用GridSpec的选项

import numpy as np
import matplotlib.pyplot as plt

N = 50
x_vals = np.random.rand(N)
y_vals = np.random.rand(N)
z1_vals = np.random.rand(N)
z2_vals = np.random.rand(N)

minimum_z = min(np.min(z1_vals), np.min(z2_vals))
maximum_z = max(np.max(z1_vals), np.max(z2_vals))

fig, axis_array = plt.subplots(1,2, figsize = (20, 10), subplot_kw = {'aspect':1})
ax0 = axis_array[0].scatter(x_vals, y_vals, c = z1_vals, s = 100, cmap = 'rainbow', vmin = minimum_z, vmax = maximum_z)
ax1 = axis_array[1].scatter(x_vals, y_vals, c = z2_vals, s = 100, cmap = 'rainbow', vmin = minimum_z, vmax = maximum_z)

cax = fig.add_axes([0.95, 0.05, 0.02, 0.95]) #this locates the axis that is used for your colorbar. It is scaled 0 - 1. 
fig.colorbar(ax0, cax, orientation = 'vertical') #'ax0' tells it which plot to base the colors on

plt.show()


要扩展我的评论,即一个人可以绘制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')

要扩展我的评论,一个人可以绘制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')

你能用我上面以答案形式给出的MWE来说明这一点吗?说清楚点,
纵横比
控制数据单位的纵横比,这通常更重要。你能用我上面以答案形式给出的MWE来说明这一点吗?说清楚点,
纵横比
控制数据单元中的纵横比,这一点通常更为重要。
cax
的比例为0-1。这与问题中的数据不符。你将如何改变比例?cax不是0-1比例。参数的单位为总空间的%。尺寸在“figsize=(20,10)”kwarg中的plt.subpllots行中指定。
cax
的比例为0-1。这与问题中的数据不符。你将如何改变比例?cax不是0-1比例。参数的单位为总空间的%。尺寸在“figsize=(20,10)”kwarg中的plt.SubPlot行中指定。