实际上,文本的边框与单位不同,例如散点图。如果调整窗口大小或更改比率,则文本是一种不同类型的对象,可以重新绘制。由于具有稳定的窗口,你可以问边界框的坐标情节单位,建立自己的彩色文本方式:
a = "all unicorns poop rainbows ! ! !".split()
c = ['red', 'orange', 'brown', 'green', 'blue', 'purple', 'black']
f = plt.figure(figsize=(4,3), dpi=120)
ax = f.add_subplot(111)
r = f.canvas.get_renderer()
space = 0.1
w = 0.5
counter = 0
for i in a:
t = ax.text(w, 1.2, a[counter],color=c[counter],fontsize=12,ha='left')
transf = ax.transData.inverted()
bb = t.get_window_extent(renderer=f.canvas.renderer)
bb = bb.transformed(transf)
w = w + bb.xmax-bb.xmin + space
counter = counter + 1
plt.ylim(0.5,2.5)
plt.xlim(0.6,1.6)
plt.show()
,这会导致:
然而这,仍然不理想,因为您需要控制绘图轴的大小以获取单词之间的正确空格。这有点武断,但如果你设法用这样的控制来完成你的程序,使用绘图单元来达到你的预期目的是可行的。
原贴:
plt.
只是调用库。事实上,你正在全局范围内创建一个plt.figure
的实例(所以它可以在本地的函数中看到)。由于这个原因,您将覆盖figure
,因为您为该变量使用了相同的名称(因此最终只有一个实例)。要解决此问题,请尝试控制图形实例的名称。例如:
import matplotlib.pyplot as plt
#%matplotlib inline
from matplotlib import transforms
fig = plt.figure(figsize=(4,3), dpi=300)
#plt.show(fig)
def rainbow_text(x,y,ls,lc,**kw):
t = plt.gca().transData
figlocal = plt.gcf()
#horizontal version
for s,c in zip(ls,lc):
text = plt.text(x,y," "+s+" ",color=c, transform=t, **kw)
text.draw(figlocal.canvas.get_renderer())
ex = text.get_window_extent()
t = transforms.offset_copy(text._transform, x=ex.width, units='dots')
plt.show(figlocal) #plt.show((figlocal,fig))
#plt.figure()
rainbow_text(0.5,0.5,"all unicorns poop rainbows ! ! !".split(),
['red', 'orange', 'brown', 'green', 'blue', 'purple', 'black'],
size=40,)
我评论的几个指令,但请注意,我给了figure
本地的功能(figlocal
)不同的名称。另外请注意,在我的节目示例中,我直接控制应该显示哪个figure
。
至于你的其他问题,发现你可以使用其他单位可以在功能文档中可以看出:
Return a new transform with an added offset.
args:
trans is any transform
kwargs:
fig is the current figure; it can be None if units are 'dots'
x, y give the offset
units is 'inches', 'points' or 'dots'
编辑:显然有某种问题与边框的文本,做的程度没有给出正确的单词宽度,因此单词之间的空间不稳定。我的建议是使用Matplotlib的胶乳功能在相同的字符串中写入颜色(因此只需调用一次plt.text)。你可以这样做:
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('pgf')
from matplotlib import rc
rc('text',usetex=True)
rc('text.latex', preamble=r'\usepackage{color}')
a = "all unicorns poop rainbows ! ! !".split()
c = ['red', 'orange', 'brown', 'green', 'blue', 'purple', 'black']
st = ''
for i in range(len(a)):
st = st + r'\textcolor{'+c[i]+'}{'+a[i]+'}'
plt.text(0.5,0.5,st)
plt.show()
然而,这不是一个理想的解决方案。原因是你需要安装Latex,包括必要的软件包(注意我正在使用颜色软件包)。看看Yann在这个问题上的回答:Partial coloring of text in matplotlib
谢谢,@armatita但如何控制(真,正规化)对于给定的单元的宽度?我问,因为这些例子会产生不一致的单词间距,这正是我最终想要解决的问题(关于我的问题的第二部分)。 –
@舞会派对2如果这种变换没有做正确的方式,那么就忘记变换。定义您的字体,对齐并使用坐标绘制每个单词。注意你已经获得了文本的边界框(text.get_window_extent()),所以你可以声明一个空格,例如0.2表示word2应该放在word1_width + 0.2中(对于word3也是如此)将会自己建立一种转变。事情是我不确定你正在使用的是什么变化实际上在做。另外:http://stackoverflow.com/questions/5320205/matplotlib-text-dimensions – armatita
是的!非常感谢!这将节省我几个小时的时间。如果你想发布这个答案,我会很乐意接受它。 –