【问题标题】:Align colorbar with GeoAxes subplot edges将颜色条与 GeoAxes 子图边缘对齐
【发布时间】:2020-11-25 15:34:33
【问题描述】:

我有一个带有 3 个子图的图形,其中两个共享一个颜色条,第三个有它自己的颜色条。

我希望颜色条与它们各自图的垂直限制对齐,并且前两个图具有相同的垂直限制。

谷歌搜索,我找到了用一个情节做到这一点的方法,但我一直试图让它适用于我的无花果。我的身材目前是这样的:

代码如下:

import cartopy.io.shapereader as shpreader
import cartopy.crs as ccrs
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import numpy as np


shpfilename = shpreader.natural_earth(resolution='50m',
                                      category='cultural',
                                      name='admin_0_countries')

reader = shpreader.Reader(shpfilename)

countries = reader.records()

projection = ccrs.PlateCarree()

fig = plt.figure()
axs = [plt.subplot(2, 2, x + 1, projection = projection) for x in range(2)]\
    + [plt.subplot(2, 2, (3, 4), projection = projection)]


def cmap_seg(cmap, value, k):
    cmaplist = [cmap(i) for i in range(cmap.N)]
    cmap = mpl.colors.LinearSegmentedColormap.from_list(
                            'Custom cmap', cmaplist, cmap.N)
    bounds = np.linspace(0, k, k + 1)
    norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
    color = cmap(norm(value))
    return color, cmap


for country in countries:
    
    c_name = country.attributes["SOVEREIGNT"]
    country_dat = df.loc[c_name]
    
    cmap = matplotlib.cm.get_cmap("plasma")
    cmap_blues = matplotlib.cm.get_cmap("Blues")
    ax_extent = [-170, 180, -65, 85]
    alpha = 1.0
    edgecolor = "k"
    linewidth = 0.5
    
    ax = axs[0]
    value = country_dat.loc["wgi_bin"]
    ax.add_geometries([country.geometry],
                    projection,
                    facecolor = cmap_seg(cmap, value, 5)[0],
                    alpha = alpha,
                    edgecolor = edgecolor,
                    linewidth = linewidth)
    ax.set_xlabel("WGI group")
    ax.set_extent(ax_extent)

    
    ax = axs[1]
    value = country_dat.loc["epi_bin"]
    ax.add_geometries([country.geometry],
                    projection,
                    facecolor = cmap_seg(cmap, value, 5)[0],
                    alpha = alpha,
                    edgecolor = edgecolor,
                    linewidth = linewidth)
    ax.set_xlabel("EPI group")
    ax.set_extent(ax_extent)
        
    
    ax = axs[2]
    value = country_dat.loc["diff"]
    ax.add_geometries([country.geometry],
                    projection,
                    facecolor = cmap_seg(cmap_blues, value, 4)[0],
                    alpha = alpha,
                    edgecolor = edgecolor,
                    linewidth = linewidth)
    ax.set_xlabel("difference")
    ax.set_extent(ax_extent)

subplot_labels = ["WGI group", "EPI group", "Metric difference"]

for i, ax in enumerate(axs):
    ax.text(0.5, -0.07, subplot_labels[i], va='bottom', ha='center',
        rotation='horizontal', rotation_mode='anchor',
        transform=ax.transAxes)
    
sm = plt.cm.ScalarMappable(cmap=cmap_seg(cmap, 5, 5)[1], norm = plt.Normalize(0, 5))
sm._A = []
cb = plt.colorbar(sm, ax = axs[1], values = [1,2,3,4, 5], ticks = [1,2,3,4,5])
                  
sm2 = plt.cm.ScalarMappable(cmap=cmap_seg(cmap_blues, 5, 4)[1], norm = plt.Normalize(0, 4))
sm2._A = []
cb2 = plt.colorbar(sm2, ax = axs[2], values = [0,1,2,3], ticks = [0,1,2,3])

【问题讨论】:

  • 颜色条可以通过选项shrink进行调整。例如,plt.colorbar(sm2, ax = axs[2], shrink=0.75, ...)0.75 的值代表正常大小的 75% 的长度。
  • 您还可以将颜色条与实际轴高度对齐。使轴可定位。如果您向我们提供df,我可以提供解释

标签: python python-3.x matplotlib cartopy


【解决方案1】:

试试这个:

# update your code for this specific line (added shrink option)
cb = plt.colorbar(sm, ax=axs[1], values=[1,2,3,4,5], ticks=[1,2,3,4,5], shrink=0.6)

并在最后添加这些代码行:

p00 = axs[0].get_position()
p01 = axs[1].get_position()
p00_new = [p00.x0, p01.y0, p00.width, p01.height]
axs[0].set_position(p00_new)

情节应该是这样的:

【讨论】:

  • 感谢您的回答,我已经尝试了您的建议。图现在更接近我想要的样子!
猜你喜欢
  • 2017-11-24
  • 1970-01-01
  • 2014-10-18
  • 2021-05-01
  • 1970-01-01
  • 2015-11-28
  • 2020-06-03
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多