python - Matplotlib 将带有 plot 和 pcolor(mesh) 的子图混合在一起,以便在 colorbar 打开时具有相同的 x 轴长度

标签 python matplotlib colorbar

我想知道是否有可能有一个子图,其中混合了使用 plot() 绘制的图形和使用 pcolormesh() 绘制的图形,它们具有相同的 x 轴长度。

当 x 轴长度相同时,当 pcolormesh() 子图没有绘制颜色条时,我附上了 2 张图片 enter image description here 以及当 pcolormesh() 子图缩小以容纳颜色条时具有颜色条的一个。 enter image description here

我想要颜色条,但它应该扩展整个图的长度而不是缩小子图。

如果不对任何当前类进行子类化,这是否可能?

最佳答案

当然,这是可能的!

正在发生的事情是为颜色条创建了一个新轴,并且空间是从绘制 pcolormesh 的轴中获取的。如果你不希望这种情况发生,你可以为要进入的颜色条指定一个坐标区对象。或者,您可以只使用水平颜色条。

无论如何,让我们用独立数据重现您的问题:

import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1977)

# Generate some interesting-looking random data...
num = 200
grid = np.random.normal(0, 1, (20, num)).cumsum(axis=1).cumsum(axis=0)
x = np.linspace(0, 360, num)
y1 = np.random.normal(0, 1, num).cumsum()
y2 = np.random.normal(0, 1, num).cumsum()

# Plot on three seperate axes
fig, axes = plt.subplots(nrows=3, sharex=True)
axes[0].plot(x, y1)
axes[1].plot(x, y2)
im = axes[2].imshow(grid, extent=[0, 360, 0, 20], aspect='auto')
fig.colorbar(im)

plt.show()

enter image description here


一个快速的解决方法是只使用水平颜色条:

import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1977)

# Generate some interesting-looking random data...
num = 200
grid = np.random.normal(0, 1, (20, num)).cumsum(axis=1).cumsum(axis=0)
x = np.linspace(0, 360, num)
y1 = np.random.normal(0, 1, num).cumsum()
y2 = np.random.normal(0, 1, num).cumsum()

# Plot on three seperate axes
fig, axes = plt.subplots(nrows=3, sharex=True)
axes[0].plot(x, y1)
axes[1].plot(x, y2)
im = axes[2].imshow(grid, extent=[0, 360, 0, 20], aspect='auto')
fig.colorbar(im, orientation='horizontal')

plt.show()

enter image description here


或者,您可以手动为颜色条添加另一个轴。我们还将稍微调整一下以腾出更多空间。

(旁注:在制作额外的轴后不要使用tight_layout。一旦我们添加了额外的轴,我们就不再使用漂亮的子图网格,所以tight_layout 将无法正常工作。之前使用它是安全的,尽管在这种情况下您可能需要修改对 subplots_adjust 的调用。)

import matplotlib.pyplot as plt
import numpy as np
np.random.seed(1977)

# Generate some interesting-looking random data...
num = 200
grid = np.random.normal(0, 1, (20, num)).cumsum(axis=1).cumsum(axis=0)
x = np.linspace(0, 360, num)
y1 = np.random.normal(0, 1, num).cumsum()
y2 = np.random.normal(0, 1, num).cumsum()

# Plot on three seperate axes
fig, axes = plt.subplots(nrows=3, sharex=True)
axes[0].plot(x, y1)
axes[1].plot(x, y2)
im = axes[2].imshow(grid, extent=[0, 360, 0, 20], aspect='auto')

# Make some room for the colorbar
fig.subplots_adjust(left=0.07, right=0.87)

# Add the colorbar outside...
box = axes[2].get_position()
pad, width = 0.02, 0.02
cax = fig.add_axes([box.xmax + pad, box.ymin, width, box.height])
fig.colorbar(im, cax=cax)

plt.show()

enter image description here

关于python - Matplotlib 将带有 plot 和 pcolor(mesh) 的子图混合在一起,以便在 colorbar 打开时具有相同的 x 轴长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23477775/

相关文章:

python - 在Python中读取文件后尝试创建x和y值的数组

python - 在python matplotlib中将轴添加到colorbar

python - 如何加速 pandas 数据帧迭代

python - 如何限制正则表达式中出现的某些字符

python - 夏令时更改会影响保存和加载 icalendar 文件的结果吗?

python - 如何在现有的 matplotlib 中绘制新图形

python - 在 x 轴上绘制一些数字

python - 减少 Keras.models.model 内存消耗

python - 在 matplotlib 中绘制多个 y 轴和颜色条

Python matplotlib 减小颜色条标签的大小