使用Matplotlib中的子图和颜色条将x轴与共享x对齐

14

我正在尝试使用pyplot创建一组具有共享x轴的子图。当图形简单并且所有x轴对齐时,这很好。然而,当我包括一个包含色条的子图时,它会压缩该特定子图的宽度以包括色条,导致子图不再共享x轴。

我在网上搜索了很多但没有成功。我尝试了几种不同的方法,但下面是最简单的示例。我在每个子图中绘制完全相同的数据,但在一个子图中绘制了一个色条。您可以看到数据不再沿着x轴对齐。

提前感谢您的帮助!


import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np
import pandas as pd

x = np.linspace(0, 10, num=100)
y = x ** 2 + 10 * np.random.randn(100)


f, (ax1, ax2) = plt.subplots(2,1,sharex=True,figsize=(8,12))

im1 = ax1.scatter(x, y, c=y, cmap='magma')
divider = make_axes_locatable(ax1)
cax = divider.append_axes("right", size="5%", pad=.05)

plt.colorbar(im1, cax=cax)

im2 = ax2.plot(x, y,'.')

plt.show()

我无法嵌入的绘图


3
可能是 matplotlib sharex with colorbar not working 的重复问题。 - Thomas Kühn
可能是Align subplot with colorbar的重复问题。 - Georgy
3个回答

7
建议使用constrained_layout=Truehttps://matplotlib.org/stable/tutorials/intermediate/constrainedlayout_guide.html
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, num=100)
y = x ** 2 + 10 * np.random.randn(100)

f, (ax1, ax2) = plt.subplots(2,1,sharex=True,figsize=(8,12),
        constrained_layout=True)
im1 = ax1.scatter(x, y, c=y, cmap='magma')
f.colorbar(im1, ax=ax1)
im2 = ax2.plot(x, y,'.')

enter image description here


1
在这里写下关于已完成的事情会很有帮助。 - Nick Koprowicz

6
这是一种不太正规的方法来实现它。
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import numpy as np
import pandas as pd

x = np.linspace(0, 10, num=100)
y = x ** 2 + 10 * np.random.randn(100)


f, (ax1, ax2) = plt.subplots(2,1,sharex=True,figsize=(8,12))

im1 = ax1.scatter(x, y, c=y, cmap='magma')
divider = make_axes_locatable(ax1)
cax = divider.append_axes("right", size="5%", pad=.05)

plt.colorbar(im1, cax=cax)

im2 = ax2.plot(x, y,'.')
divider2 = make_axes_locatable(ax2)
cax2 = divider2.append_axes("right", size="5%", pad=.05)
cax2.remove()
plt.show()

结果会导致

在此输入图片描述


1
我实际上很喜欢这个简单的程序,而且我更有信心测量结果会准确。 - user3317621

0

当你创建子图时,可以考虑到颜色条所需的宽度。不要使用divider,而是使用gridspec_kw生成四个不同宽度的子图。然后可以删除第二个子图中不需要的cax

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, num=100)
y = x ** 2 + 10 * np.random.randn(100)



##creating four subplots with unequally divided widths:
f, axes = plt.subplots(
    2,2, sharex='col', figsize=(8,12),
    gridspec_kw = {'width_ratios' : (10,1)},
)
ax1,ax2 = axes[:,0]

##remove unneeded Axes instance:
axes[1,1].remove()

im1 = ax1.scatter(x, y, c=y, cmap='magma')
plt.colorbar(im1, cax=axes[0,1])

im2 = ax2.plot(x, y,'.')

f.savefig('sharex_colorbar.png')

结果看起来像这样:

result of the above code

作为删除不必要的子图实例的替代方案,您也可以首先显式生成网格规范,然后仅生成所需的子图。如果您有许多绘图,则这可能更合适:

from matplotlib.gridspec import GridSpec
gs = GridSpec(nrows=2, ncols=2, width_ratios = (10,1))
f = plt.figure(figsize=(8,12))

ax1 = f.add_subplot(gs[0,0])
ax2 = f.add_subplot(gs[1,0],sharex=ax1)
cax = f.add_subplot(gs[0,1])

im1 = ax1.scatter(x, y, c=y, cmap='magma')
plt.colorbar(im1, cax=cax)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接