我正在尝试在python中创建一个图形,并且使得相同的annonate文本将具有两种颜色,一半的annonate将是蓝色而另一半将是红色。
我认为代码解释了自己。我有3行1绿色与绿色annonate,1蓝色与蓝色annonate。
第3个是红色,它是地块1和地块2的总和,我希望它有半个蓝色和半绿色。
ipython -pylab
x=arange(0,4,0.1)
exp1 = e**(-x/5)
exp2 = e**(-x/1)
exp3 = e**(-x/5) +e**(-x/1)
figure()
plot(x,exp1)
plot(x,exp2)
plot(x,exp1+exp2)
title('Exponential Decay')
annotate(r'$e^{-x/5}$', xy=(x[10], exp1[10]), xytext=(-20,-35),
textcoords='offset points', ha='center', va='bottom',color='blue',
bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.95',
color='b'))
annotate(r'$e^{-x/1}$', xy=(x[10], exp2[10]), xytext=(-5,20),
textcoords='offset points', ha='center', va='bottom',color='green',
bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=-0.5',
color='g'))
annotate(r'$e^{-x/5} + e^{-x/1}$', xy=(x[10], exp2[10]+exp1[10]), xytext=(40,20),
textcoords='offset points', ha='center', va='bottom',
bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=-0.5',
color='red'))
有可能吗?
答案 0 :(得分:8)
我不认为你可以在一个注释中有多种颜色,因为 - 据我所知 - annotate
只需要一个文本对象作为参数,而文本对象只支持单一颜色。所以,据我所知,没有"本地人"或者"优雅"自动执行此操作的方法。
但是,有一种解决方法:您可以在图表中任意放置多个文本对象。所以这就是我的工作方式:
fig1 = figure()
# all the same until the last "annotate":
annotate(r'$e^{-x/5}$'+r'$e^{-x/1}$', xy=(x[10], exp2[10]+exp1[10]), xytext=(40,20),
textcoords='offset points', ha='center', va='bottom',color='white',
bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=-0.5',
color='r'))
fig1.text(0.365, 0.62, r'$e^{-x/5}$', ha="center", va="bottom", size="medium",color="blue")
fig1.text(0.412, 0.62, r'$e^{-x/1}$', ha="center", va="bottom", size="medium",color="green")
我做的是:
color='black'
; fig1
的中心); annotate
生成的黑色文本大致重叠(最终成为您在text
的两次调用中看到的值;)color='white'
,因此它不会干扰重叠文本的颜色。这是输出:
它不是很优雅,它确实需要一些绘图来微调位置,但它可以完成工作。
如果您需要多个图表,或许可以自动执行展示位置:如果您不存储fig1
对象,则text
的坐标将成为实际的x,图中的y坐标 - 我发现有点难以使用,但也许它可以让你使用注释xy
坐标自动生成它们?对我来说听起来不值得,但如果你做到了,我想看看代码。
答案 1 :(得分:5)
您可以使用r'$\textcolor{blue}{e^{-x/5}} + \textcolor{green}{e^{-x/1}}$'
使文字半蓝,半绿。使用您自己的代码,例如:
图像由以下代码生成。使用matplotlib v2.1.2使用默认的matplotlibrc
设置进行测试。
import matplotlib as matplotlib
matplotlib.use('pgf')
matplotlib.rc('pgf', texsystem='pdflatex') # from running latex -v
preamble = matplotlib.rcParams.setdefault('pgf.preamble', [])
preamble.append(r'\usepackage{color}')
from numpy import *
from matplotlib.pyplot import *
x=arange(0,4,0.1)
exp1 = e**(-x/5)
exp2 = e**(-x/1)
exp3 = e**(-x/5) +e**(-x/1)
figure()
plot(x,exp1)
plot(x,exp2)
plot(x,exp1+exp2)
title('Exponential Decay')
annotate(r'$e^{-x/5}$', xy=(x[10], exp1[10]), xytext=(-20,-25),
textcoords='offset points', ha='center', va='bottom',color='blue',
bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0.95',
color='b'))
annotate(r'$e^{-x/1}$', xy=(x[10], exp2[10]), xytext=(25,20),
textcoords='offset points', ha='center', va='bottom',color='green',
bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=-0.5',
color='g'))
annotate(r'$\textcolor{blue}{e^{-x/5}} + \textcolor[rgb]{0.0, 0.5, 0.0}{e^{-x/1}}$',
xy=(x[10], exp2[10]+exp1[10]), xytext=(40,20),
textcoords='offset points', ha='center', va='bottom',
bbox=dict(boxstyle='round,pad=0.2', fc='yellow', alpha=0.3),
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=-0.5',
color='red'))
savefig('test.png')
主要是您的代码有以下更改:
pgf
后端。color
pgf.preamble
xytext
已更改。color='g'
实际上并没有像rgb的(0,255,0)那样使用纯粹的“绿色”颜色。 \textcolor[rgb]{0.0, 0.5, 0.0}
让它看起来很像。