gpt4 book ai didi

python - 子类化 matplotlib 文本 : manipulate properties of child artist

转载 作者:太空狗 更新时间:2023-10-29 18:08:39 24 4
gpt4 key购买 nike

我正在研究一个用于线对象内联标签的类的实现。为此,我制作了 Text 类的子类,作为 Line2D 对象的属性。我的代码 previous post可能有点冗长,所以我在这里隔离了问题:

from matplotlib.text import Text
from matplotlib import pyplot as plt
import numpy as np


class LineText(Text):
def __init__(self,line,*args,**kwargs):
x_pos = line.get_xdata().mean()
y_pos = line.get_ydata().mean()
Text.__init__(self,x=x_pos,y=y_pos,*args,**kwargs)
self.line = line
def draw(self,renderer):
self.line.set_color(self.get_color())
self.line.draw(renderer = renderer)
Text.draw(self,renderer)



if __name__ == '__main__':

x = np.linspace(0,1,20)
y = np.linspace(0,1,20)
ax = plt.subplot(1,1,1)
line = plt.plot(x,y,color = 'r')[0]
linetext = LineText(line,text = 'abc')
ax.add_artist(linetext)
plt.show()

该类采用 plot 函数返回的 Line2D 句柄,并在 .draw 方法中对线。出于说明目的,我在这里只是尝试更改其颜色。

改变线条的颜色后,我调用线条draw。然而,这并没有达到预期的效果。刚画出来的时候,好像有一条红线和一条黑线叠加在一起。一旦调整图形大小或以其他方式强制重绘,线条就会按预期改变颜色。到目前为止,我发现强制在打开时正确绘制图形的唯一方法是在 show() 之前添加一个 plt.draw()。然而,这确实让人感到笨拙。

我能以某种方式强制只重绘线对象吗?还是我做的完全错了?

提前致谢。

最佳答案

问题是你没有更新行直到它被重新绘制,我认为这应该有效:

class LineText(Text):
def __init__(self,line,*args,**kwargs):
x_pos = line.get_xdata().mean()
y_pos = line.get_ydata().mean()
Text.__init__(self,x=x_pos,y=y_pos,*args,**kwargs)
self.line = line
self.line.set_color(self.get_color())
plt.gca().add_artist(self.line) # You could also pass `ax` instead of calling `plt.gca()`
plt.gca().add_artist(self)


if __name__ == '__main__':

x = np.linspace(0,1,20)
y = np.linspace(0,1,20)
ax = plt.subplot(1,1,1)
line = plt.plot(x,y, 'r--', alpha=0.5)[0]
linetext = LineText(line,text = 'abc')
# ax.add_artist(linetext) # Artist is being added in `__init__` instead
plt.show(block=False)

关于python - 子类化 matplotlib 文本 : manipulate properties of child artist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33960737/

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