gpt4 book ai didi

python - matplotlib 中基于坐标的字体大小

转载 作者:行者123 更新时间:2023-12-01 08:56:10 32 4
gpt4 key购买 nike

我想在 matplotlib 中渲染文本,其中字体的大小是根据坐标而不是 pt 指定的。我的用例是渲染单个字母,其大小与后台底层框(Patch 实例)的大小相匹配。

如果我可以独立指定宽度和高度,从而产生缩放的字母,那么将会有一个额外的好处。

最佳答案

根据@ImportanceOfBeingErnest的评论,我得出以下解决方案:

def set_font_size_in_coord(text, width=None, height=None, mode="unlocked"):
from matplotlib.transforms import Bbox
from matplotlib.text import Text
from matplotlib.patheffects import AbstractPathEffect

class TextScaler(AbstractPathEffect):
def __init__(self, text, width, height, mode):
self._text = text
self._mode = mode
self._width = width
self._height = height

def draw_path(self, renderer, gc, tpath, affine, rgbFace=None):
ax = self._text.axes
renderer = ax.get_figure().canvas.get_renderer()
bbox = text.get_window_extent(renderer=renderer)
bbox = Bbox(ax.transData.inverted().transform(bbox))

if self._mode == "proportional":
if self._width is None:
# Proportional scaling based on height
scale_y = self._height / bbox.height
scale_x = scale_y
elif self._height is None:
# Proportional scaling based on width
scale_x = self._width / bbox.width
scale_y = scale_x
elif self._mode == "unlocked":
scale_x = self._width / bbox.width
scale_y = self._height / bbox.height
elif self._mode == "minimum":
scale_x = self._width / bbox.width
scale_y = self._height / bbox.height
scale = max(scale_x, scale_y)
scale_x, scale_y = scale, scale
elif self._mode == "maximum":
scale_x = self._width / bbox.width
scale_y = self._height / bbox.height
scale = min(scale_x, scale_y)
scale_x, scale_y = scale, scale

affine = affine.identity().scale(scale_x, scale_y) + affine
renderer.draw_path(gc, tpath, affine, rgbFace)

if mode in ["unlocked", "minimum", "maximum"]:
if width is None or height is None:
raise TypeError(
f"Width and height must be set in '{mode}' mode"
)
elif mode == "proportional":
if not (width is None and height is not None) or \
not (height is None and width is not None):
raise TypeError(
f"Either width or height must be set in '{mode}' mode"
)
else:
raise ValueError(
f"Unknown mode '{mode}'"
)
text.set_path_effects([TextScaler(text, width, height, mode)])

关于python - matplotlib 中基于坐标的字体大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52756921/

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