关于python:使用colorbar在绘图中设置相等的长宽比

您所在的位置:网站首页 plt图片长宽比例 关于python:使用colorbar在绘图中设置相等的长宽比

关于python:使用colorbar在绘图中设置相等的长宽比

2023-07-24 16:48| 来源: 网络整理| 查看: 265

我需要生成一个在两个轴上都具有相等长宽比的图,并在右侧显示一个色条。 我尝试设置aspect='auto',aspect=1和aspect='equal',但效果不佳。 请参见下面的示例和MWE。

使用aspect='auto',颜色条的高度正确,但图形失真:

使用aspect=1或aspect='equal'时,图是正方形的(两个轴上的长宽比相等),但是颜色条失真了:

在两个图中,由于某种原因,颜色条都位于右侧太远。 如何获得具有匹配高度的颜色条的正方形图?

MWE

12345678910111213141516171819202122232425262728293031323334353637383940414243444546import numpy as np import matplotlib.gridspec as gridspec import matplotlib.pyplot as plt def col_plot(params):     gs, i, data = params     xarr, yarr, zarr = zip(*data)[0], zip(*data)[1], zip(*data)[2]     xmin, xmax = min(xarr), max(xarr)     ymin, ymax = min(yarr), max(yarr)     #plt.subplot(gs[i], aspect='auto')     plt.subplot(gs[i], aspect=1)     #plt.subplot(gs[i], aspect='equal')     plt.xlim(xmin, xmax)     plt.ylim(xmin, xmax)     plt.xlabel('$x axis$', fontsize=20)     plt.ylabel('$y axis$', fontsize=20)     # Scatter plot.     cm = plt.cm.get_cmap('RdYlBu_r')     SC = plt.scatter(xarr, yarr, marker='o', c=zarr, s=60, lw=0.25, cmap=cm,         zorder=3)     # Colorbar.     ax0 = plt.subplot(gs[i + 1])     cbar = plt.colorbar(SC, cax=ax0)     cbar.set_label('$col bar$', fontsize=21, labelpad=-2) # Generate data. data0 = np.random.uniform(0., 1., size=(50, 3)) data1 = np.random.uniform(0., 1., size=(50, 3)) # Create the top-level container fig = plt.figure(figsize=(14, 25)) gs = gridspec.GridSpec(4, 4, width_ratios=[1, 0.05, 1, 0.05]) # Generate plots. par_lst = [[gs, 0, data0], [gs, 2, data1]] for pl_params in par_lst:     col_plot(pl_params) # Output png file. fig.tight_layout() plt.savefig('colorbar_aspect.png', dpi=300)

您可以使用AxesDivider来做到这一点。 我对您的代码做了一些修改,以利用AxesDivider。

123456789101112131415161718192021222324252627282930313233343536import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import make_axes_locatable def col_plot(data):     xarr, yarr, zarr = zip(*data)[0], zip(*data)[1], zip(*data)[2]     xarr = [2*x for x in xarr]     xmin, xmax = min(xarr), max(xarr)     ymin, ymax = min(yarr), max(yarr)     fig = plt.figure()     ax0 = fig.add_subplot(111, aspect='equal')     plt.xlim(xmin, xmax)     plt.ylim(ymin, ymax)     plt.xlabel('$x axis$', fontsize=20)     plt.ylabel('$y axis$', fontsize=20)     # Scatter plot.     cm = plt.cm.get_cmap('RdYlBu_r')     SC = ax0.scatter(xarr, yarr, marker='o', c=zarr, s=60, lw=0.25, cmap=cm,         zorder=3)     the_divider = make_axes_locatable(ax0)     color_axis = the_divider.append_axes("right", size="5%", pad=0.1)     # Colorbar.     cbar = plt.colorbar(SC, cax=color_axis)     cbar.set_label('$col bar$', fontsize=21, labelpad=-2) # Generate data. data0 = np.random.uniform(0., 1., size=(20, 3)) col_plot(data0)

这是结果(出于演示目的,我更改了您的数据,使其在x方向上跨越了[0,2]的范围):

相关讨论 谢谢朱利安! 我不得不稍微修改一下您的答案,但是使用make_axes_locatable是一个很好的解决方案。

在Joseph Long的博客上,有以下不错的解决方案。

1)将colorbar函数定义为:

12345678from mpl_toolkits.axes_grid1 import make_axes_locatable def colorbar(mappable):     ax = mappable.axes     fig = ax.figure     divider = make_axes_locatable(ax)     cax = divider.append_axes("right", size="5%", pad=0.05)     return fig.colorbar(mappable, cax=cax)

2)当您要制作颜色条时,调用colorbar(thing)。 在您的情况下:

1234SC = ax0.scatter(xarr, yarr, marker='o', c=zarr, s=60, lw=0.25, cmap=cm,     zorder=3) colorbar(SC)

3)您会得到:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3