【问题标题】:Putting one color bar for several subplots from different dataframes为来自不同数据帧的多个子图放置一个颜色条
【发布时间】:2021-01-22 12:27:32
【问题描述】:

我到处看了看,没有任何帮助。 这是我的代码:

fig = plt.figure(figsize=(12, 6))
marker_colors = pca_data2['Frame']
fig.suptitle('PCA')

plt.subplot(1, 2, 1)
x = pca_data2.PC_1
y = pca_data2.PC_2
plt.scatter(x, y, c = marker_colors, cmap = "inferno")
plt.colorbar()

plt.subplot(1, 2, 2)
x1 = pca_data.PC_1
y1 = pca_data.PC_2
plt.scatter(x1, y1, c = marker_colors, cmap = "inferno")
plt.colorbar()

plt.show()

pca_data 和 pca_data2 是两个完全不同的数据帧,用于完成不同的事情。但我需要它们并排放置,1 个颜色条位于右侧。

图是这样的

当我尝试删除第一个 plt.colorbar() 时,两个子图看起来不均匀。 非常感谢您的帮助。

【问题讨论】:

  • “两个子图看起来不均匀”:你能说得更具体点吗?
  • @runDOSrun 我的意思是,当我删除 x 和 y 下方的第一个 plt.colorbar() 时,第一个图会伸展,而第二个图会有点挤压,使它们看起来不均匀。我正在尝试绘制,以便所有图看起来即使只有一个颜色条

标签: python pandas matplotlib


【解决方案1】:

...因为似乎没有一个答案提到您可以告诉颜色条应该在哪个轴上绘制它...这是一个简单的示例:

这样做的好处是:

  • 阅读起来更清晰
  • 您可以完全控制颜色条的大小
  • 您可以轻松地将其扩展到任何子图网格和颜色条的任何位置
import numpy as np    
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
# generate some data
data, data1 = np.random.rand(10,10), np.random.rand(10,10)
x, y = np.meshgrid(np.linspace(0,1,10), np.linspace(0,1,10))

# initialize a plot-grid with 3 axes (2 plots and 1 colorbar)
gs = GridSpec(1, 3, width_ratios=[.48,.48,.04])

# set vmin and vmax explicitly to ensure that both colorbars have the same range!
vmin = np.min([np.min(data), np.min(data1)])
vmax = np.max([np.max(data), np.max(data1)])

plot_kwargs = dict(cmap = "inferno", vmin=vmin, vmax=vmax)

fig = plt.figure(figsize=(12, 6))
ax_0 = fig.add_subplot(gs[0], aspect='equal')
ax_1 = fig.add_subplot(gs[1], aspect='equal')
ax_cb = fig.add_subplot(gs[2])


s1 = ax_0.scatter(x, y, c = data, **plot_kwargs)
s2 = ax_1.scatter(x, y, c = data1, **plot_kwargs)

plt.colorbar(s1, cax=ax_cb)

【讨论】:

    【解决方案2】:

    您可以使用aspect 在子图上设置固定的纵横比。然后将颜色条附加到每个轴的右侧并丢弃第一个颜色条,以获得均匀的布局:

    import matplotlib.pyplot as plt
    import numpy as np
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    
    fig = plt.figure(figsize=(12, 6))
    marker_colors = range(0,10)
    
    x = x1 = np.random.randint(0,10,10)
    y = y1 = np.random.randint(0,10,10)
    
    ax1 = fig.add_subplot(1, 2, 1, aspect="equal") # or e.g. aspect=0.9
    g1 = ax1.scatter(x, y, c = marker_colors, cmap = "inferno", )
    
    ax2 = fig.add_subplot(1, 2, 2, aspect="equal") # or e.g. aspect=0.9
    g2 = ax2.scatter(x1, y1, c = marker_colors, cmap = "inferno")
    
    # put colorbars right next to axes
    divider1 = make_axes_locatable(ax1)
    cax1 = divider1.append_axes("right", size="5%", pad=0.05)
    
    divider2 = make_axes_locatable(ax2)
    cax2 = divider2.append_axes("right", size="5%", pad=0.05)
    
    # reserve space for 1st colorbar, then remove
    cbar1 = fig.colorbar(g1, cax=cax1)
    fig.delaxes(fig.axes[2])
    
    # 2nd colorbar
    cbar2 = fig.colorbar(g2, cax=cax2)
    
    plt.tight_layout()
    
    plt.show()
    

    如果你想要不同的纵横比,你可以修改aspect,例如到aspect=0.9。结果将锁定子图的纵横比,即使您调整图形框的大小:

    【讨论】:

      【解决方案3】:

      使用以下代码: 希望它与您的问题陈述相符。

      fig = plt.figure(figsize=(12, 6))
      marker_colors = range(0,10)
      
      x=x1=np.random.randint(0,10,10)
      y=y1=np.random.randint(0,10,10)
      
      plt.subplot(1, 2, 1)
      g1=plt.scatter(x, y, c = marker_colors, cmap = "inferno")
      
      
      plt.subplot(1, 2, 2)
      g2=plt.scatter(x1, y1, c = marker_colors, cmap = "inferno")
      
      g11=plt.colorbar(g1)
      g12=plt.colorbar(g2)
      
      g11.ax.set_title('g1')
      g12.ax.set_title('g2')
      

      【讨论】:

        猜你喜欢
        • 2017-02-05
        • 2021-10-16
        • 1970-01-01
        • 2019-05-29
        • 2021-07-13
        • 2013-06-14
        • 2021-08-14
        相关资源
        最近更新 更多