与轴尺寸相比,绘制小楔形时精度较差

问题描述 投票:0回答:2

我正在尝试重新创建此网站上的图表:https://bumps.live/torpids/2022。我正在使用 matplotlib,但在绘制徽标时遇到了问题,我用下面的 MWE 重新创建了徽标。我正在绘制两个彼此相邻的半圆,当它们与轴的大小相同时,结果与预期一致,但是当它们小得多时,就会损失精度,并且半圆不再占据一半的空间一个圆圈。下面两幅图中两个半圆的半径都是0.1,但第一幅图的轴限制为-0.15到0.15,第二幅图的轴限制为-10到10(我放大了右图)。当使用 plt.show 并放大时,不会出现此问题。

Regular size semicircles compared to axes

Small semicircles compared to axes (zoomed in)

我猜测 matplotlib 已经将楔形定义到了适当的准确度,假设没有人放大太多,尽管当我放大时,这还不够。我询问了 ChatGPT,它建议将

resolution=100
kwarg 添加到我的楔子中,但这似乎已被弃用或出现错误。我正在使用 python 3.12.3 和 matplotlib 3.9.1.post1。我需要制作大约 350 个徽标,如果性能足够好作为备份计划,我愿意将它们添加为 SVG,但理想情况下我想了解如何解决此问题。

import matplotlib.pyplot as plt
from matplotlib.patches import Wedge

fig, ax = plt.subplots(figsize=(5, 5))

radius = 0.1
left_semicircle = Wedge((0, 0), radius, 0, 180, color="r")
right_semicircle = Wedge((0, 0), radius, 180, 360, color="b")

ax.add_patch(left_semicircle)
ax.add_patch(right_semicircle)

axis_limit = 0.15
axis_limit = 10
ax.set_xlim((-axis_limit, axis_limit))
ax.set_ylim((-axis_limit, axis_limit))
ax.set_aspect('equal')

plt.savefig(f"TwoSemicircles_{axis_limit}.pdf")
python matplotlib precision
2个回答
0
投票

设置颜色时,您同时设置了面颜色(形状内部的颜色)和边缘颜色(轮廓的颜色)。 然后,Matplotlib 以默认线宽 1 磅绘制轮廓。 该线宽被保留用于

plt.show
中的交互式缩放,但在 pdf 中,线宽是页面大小的固定比例。 相反,你应该只是设置面部颜色

left_semicircle = Wedge((0, 0), radius, 0, 180, facecolor="r")
right_semicircle = Wedge((0, 0), radius, 180, 360, facecolor="b")

然后 Matplotlib 不会绘制边缘。


0
投票

这看起来像是 matplotlib 中的一个错误,中心的坐标首先转换为图形空间,这适用于 jpg 和 png,但由于 pdf(和 svgs)接受浮动坐标,这种转换会导致准确性损失。

您可以将

figsize
做得更大(例如20,20而不是5,5),这将部分解决您的问题,但我不确定其含义,您可能需要调整许多东西的大小,例如轴以及任何标签。

© www.soinside.com 2019 - 2024. All rights reserved.