【问题标题】:Aligning x-axis with sharex using subplots and colorbar with matplotlib使用 matplotlib 使用 subplots 和 colorbar 将 x 轴与 sharex 对齐
【发布时间】:2019-06-25 16:11:19
【问题描述】:

我正在尝试使用 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()

【问题讨论】:

标签: python matplotlib colorbar


【解决方案1】:

您可以在创建子图时考虑颜色条的需要。不使用分隔线,而是使用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')

结果如下:

作为删除 unneded subplot 实例的替代方法,您还可以首先显式生成 gridspec 并仅生成所需的 subplot。如果您有很多地块,这可能更合适:

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)

【讨论】:

    【解决方案2】:

    这是一种很老套的方法。

    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()
    

    结果

    【讨论】:

    • 我真的很喜欢这个简单,而且我更有信心测量结果是准确的。
    【解决方案3】:

    建议使用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,'.')
    

    【讨论】:

    • 如果能在此写下关于所做工作的任何内容将会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多