使用 matplotlib 指示多个子图的数据范围的颜色条?
One colorbar to indicate data range for multiple subplots using matplotlib?
类似的问题我看过很多this one。然而,颜色条实际上表示最后一个子图的数据范围,如下代码验证:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(19680801)
fig, axs = plt.subplots(2, 1)
cmaps = ['RdBu_r', 'viridis']
for row in range(2):
ax = axs[row]
if row == 0:
pcm = ax.pcolormesh(np.random.random((20, 20)) * (-100),
cmap=cmaps[0])
elif row == 1:
pcm = ax.pcolormesh(np.random.random((20, 20)) * 100,
cmap=cmaps[0])
fig.colorbar(pcm, ax=axs)
plt.show()
colobar只表示第二个子图的数据范围。第一个子图中的数据实际上是负数,颜色栏中没有显示。
fig, axs = plt.subplots(2, 1)
cmaps = ['RdBu_r', 'viridis']
for row in range(2):
ax = axs[row]
if row == 0:
pcm = ax.pcolormesh(np.random.random((20, 20)) * (-100),
cmap=cmaps[0])
elif row == 1:
pcm = ax.pcolormesh(np.random.random((20, 20)) * 100,
cmap=cmaps[0])
fig.colorbar(pcm, ax=ax)
plt.show()
那么如何让多个子图共享一个颜色条来指示整体数据范围?
问题可能是fig.colorbar(pcm, ax=axs)
引起的,其中pcm
指向第二个子图,但我不知道如何解决这个问题。
将颜色限制设置为相同...
import matplotlib.pyplot as plt
import numpy as np
fig, axs = plt.subplots(2, 1)
cmaps = ['RdBu_r', 'viridis']
for row in range(2):
ax = axs[row]
mult = -100 if row == 0 else 100
pcm = ax.pcolormesh(np.random.random((20, 20)) * mult,
cmap=cmaps[0], vmin=-150, vmax=150)
fig.colorbar(pcm, ax=axs)
plt.show()
或者等效地,您可以指定一个 Normalize 对象:
import matplotlib.pyplot as plt
import numpy as np
fig, axs = plt.subplots(2, 1)
cmaps = ['RdBu_r', 'viridis']
norm = plt.Normalize(vmin=-150, vmax=150)
for row in range(2):
ax = axs[row]
mult = -100 if row == 0 else 100
pcm = ax.pcolormesh(np.random.random((20, 20)) * mult,
cmap=cmaps[0], norm=norm)
fig.colorbar(pcm, ax=axs)
plt.show()
类似的问题我看过很多this one。然而,颜色条实际上表示最后一个子图的数据范围,如下代码验证:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(19680801)
fig, axs = plt.subplots(2, 1)
cmaps = ['RdBu_r', 'viridis']
for row in range(2):
ax = axs[row]
if row == 0:
pcm = ax.pcolormesh(np.random.random((20, 20)) * (-100),
cmap=cmaps[0])
elif row == 1:
pcm = ax.pcolormesh(np.random.random((20, 20)) * 100,
cmap=cmaps[0])
fig.colorbar(pcm, ax=axs)
plt.show()
colobar只表示第二个子图的数据范围。第一个子图中的数据实际上是负数,颜色栏中没有显示。
fig, axs = plt.subplots(2, 1)
cmaps = ['RdBu_r', 'viridis']
for row in range(2):
ax = axs[row]
if row == 0:
pcm = ax.pcolormesh(np.random.random((20, 20)) * (-100),
cmap=cmaps[0])
elif row == 1:
pcm = ax.pcolormesh(np.random.random((20, 20)) * 100,
cmap=cmaps[0])
fig.colorbar(pcm, ax=ax)
plt.show()
那么如何让多个子图共享一个颜色条来指示整体数据范围?
问题可能是fig.colorbar(pcm, ax=axs)
引起的,其中pcm
指向第二个子图,但我不知道如何解决这个问题。
将颜色限制设置为相同...
import matplotlib.pyplot as plt
import numpy as np
fig, axs = plt.subplots(2, 1)
cmaps = ['RdBu_r', 'viridis']
for row in range(2):
ax = axs[row]
mult = -100 if row == 0 else 100
pcm = ax.pcolormesh(np.random.random((20, 20)) * mult,
cmap=cmaps[0], vmin=-150, vmax=150)
fig.colorbar(pcm, ax=axs)
plt.show()
或者等效地,您可以指定一个 Normalize 对象:
import matplotlib.pyplot as plt
import numpy as np
fig, axs = plt.subplots(2, 1)
cmaps = ['RdBu_r', 'viridis']
norm = plt.Normalize(vmin=-150, vmax=150)
for row in range(2):
ax = axs[row]
mult = -100 if row == 0 else 100
pcm = ax.pcolormesh(np.random.random((20, 20)) * mult,
cmap=cmaps[0], norm=norm)
fig.colorbar(pcm, ax=axs)
plt.show()