gpt4 book ai didi

matplotlib - 颜色栏框架和颜色未对齐

转载 作者:行者123 更新时间:2023-12-05 05:21:32 26 4
gpt4 key购买 nike

我对颜色条有一个恼人的问题,即使经过积极的研究,我也找不到问题,甚至被问到。我有一个覆盖轮廓和 pcolormesh 的图,我想要一个颜色条来指示值。除了一件事外,这很好用: The colorbar frame and color are offset

颜色条框架和实际条是偏移的,因此在框架下方有一个白色位,而在顶部颜色是突出的。当框架根据需要与轴对齐时,颜色条会发生偏移。

这是一个模拟我所处情况的工作示例,即带有插图的多个图。

import matplotlib.gridspec as gridspec
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

figheight = 4.2 - (2.1 - 49.519 / 25.4)
matplotlib.rcParams['figure.figsize'] = (5.25, figheight)
matplotlib.rcParams['axes.linewidth'] = 0.5

fig = plt.figure()
grid = gridspec.GridSpec(2, 1, height_ratios=[49.519 / 25.4 / figheight, 2.1 / figheight])
ax0 = plt.subplot(grid[0, 0])
ax1 = plt.subplot(grid[1, 0])

plt.tight_layout()

###############################################################################################
#
# Define position of inset
#
###############################################################################################

ax1.axis('off')
pos1 = ax1.get_position()
pos2 = matplotlib.transforms.Bbox([[pos1.x0, pos1.y0],
[.8*pos1.x1,
0.8*pos1.height + pos1.y0]])
left, bottom, width, height = [pos2.x0, pos2.y0, pos2.width, pos2.height]

ax2 = fig.add_axes([left, bottom, width, height])

###############################################################################################
#
# ax2 (inset) plot
#
###############################################################################################

pos2 = ax2.get_position()
ax2.axis('on')

x = np.linspace(0,5)
z = (np.outer(np.sin(x), np.cos(x))+1)*0.5

im = ax2.pcolormesh(z)
c = ax2.contour(z, linewidths=7)

ax2pos = ax2.get_position()

cbar_axis = fig.add_axes([ax2pos.x1+0.05,ax2pos.y0, .02, ax2pos.height])
colorbar = fig.colorbar(im, ax = ax2,
cax = cbar_axis, ticks = [0.1, .5, .9])
colorbar.outline.set_visible(True)

plot = 'Minimal.pdf'

fig.savefig(plot)

plt.close()

如果选择“内联”图形后端,内联显示和保存的 .pdf 中的问题仍然存在。使用或不使用紧密布局会根据条的大小改变偏移的严重程度 - 与使用 PyQT5 而不是内联图形后端相同。当我在各种组合之间切换时,我以为它不见了,但我才意识到它还在那里。

如有任何意见,我将不胜感激。


正如 ImportanceOfBeingErnest 所建议的那样,我尝试在 figsize 上使用 np.round 并且没有改变任何事情。虽然您可以随意调整尺寸以使其看起来不错,但它总是会偏向一侧或另一侧。当我将 Spyder 3 上的图形后端从“Inline”更改为“QT5”时,无论有无舍入,问题都会变得不那么严重。这张图片对此进行了总结 Colorbar overlap cases .请注意,使用 not rounded 和 PyQT5,问题仍然存在,但没有那么严重。

最佳答案

经过检查,很明显颜色条不仅在其轴的顶部渗出,而且还略微偏左。 The original problem, showing the bleed-over of the colorbar所以,这里的问题似乎是发生光栅化时颜色条轴的位置与颜色条本身之间的冲突。您可以在此 issue in matplotlib's github repository 上找到更多详细信息,但我会总结这里发生的事情。

颜色条在生成输出时被栅格化,以避免在渲染过程中出现伪影问题。在光栅化过程中,颜色条的位置被捕捉到最近的整数像素,而轴保持在它应该在的位置。然后,当生成输出时,颜色条落在图像固定像素的边界内,尽管图像本身是矢量化的。因此,可以采用两种策略来避免这种事故。

使用更精细的 DPI

从矢量化坐标到光栅化坐标的转换发生在假定图像上有给定 DPI 的情况下。默认情况下,这设置为 72。但是,通过使用更多 DPI,光栅化过程引起的整体偏移将更小,因为颜色条将捕捉到的最近像素将更近。在这里,我们将输出更改为具有 fig.savefig(plot,dpi=4000),问题就消失了: A close look at the edge of the colorbar, showing that it is well contained within the axis bounds但是请注意,在我的机器上,由于这一变化,输出大小从 62 KB 变为 78 KB(尽管 DPI 调整也是,无可否认,极端)。如果您担心文件大小,您应该选择较低的 DPI 来解决问题。

使用不同的颜色图

当颜色栏中的颜色超过 50 种时,就会发生这种光栅化。因此,我们可以做一个快速测试,通过以下方式将我们的颜色映射设置为 Pastel1im = ax2.pcolormesh(z,cmap='Pastel1')。在这里,颜色条/轴不匹配得到缓解。

The colorbar with a colormap of Pastel1; despite no other changes, the mismatch has been rectified.

作为后备方案,采用少于 50 种颜色的颜色条应该可以缓解这个问题。

光栅化轴

为了完整起见,还有第三种选择。如果您栅格化颜色条轴,则轴边界和颜色图都将被栅格化,并且您将丢失偏移量。这也将栅格化您的标签,并且轴将移动为一个,打破与附近轴的对齐。为此,您只需包含 cbar_axis.set_rasterized(True)The colorbar has been rasterized, solving the problem but then producing rasterization issues.

关于matplotlib - 颜色栏框架和颜色未对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42798366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com