2014-06-08 130 views
13

我想在python中創建一個圖形,並使得相同的annonate文本將具有兩種顏色,annonate的一半將是藍色,另一半將是紅色。matplotlib兩種不同的顏色在相同的註釋

我認爲代碼可以解釋它自己。我有3行1綠色與綠色annonate,1藍色與藍色annone。

第三個是紅色的情節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

@bli你看看[這個問題](https://stackoverflow.com/questions/9169052/partial-coloring-of-text-in-matplotlib)? – ImportanceOfBeingErnest

+0

謝謝。這個答案確實非常相關:https://stackoverflow.com/a/42768093/1878788 – bli

回答

7

我不認爲您可以在單個註釋中使用多種顏色,因爲 - 據我所知 - 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") 

我所做的是:

  1. 我設置的註釋color='black';
  2. 我在位置0.5,0.5(意思是fig1的中心)創建了兩個文本對象;
  3. 我手動改變了位置,直到它們與由annotate生成的黑色文本大致重疊(最終成爲您在text的兩次調用中看到的值);
  4. 我設置註釋color='white',所以它不會影響重疊文本的顏色。

下面是輸出:

multi-colour annotated graph

這不是很優雅,而且它確實需要一些繪製微調的位置,但它能夠完成任務。

如果你需要幾個圖,也許有一種方法來自動化放置:如果​​你沒有存儲fig1對象,text的座標將成爲圖中實際的x,y座標 - 我發現有點困難使用,但也許它可以讓你使用註釋的座標自動生成它們?對我來說這聽起來不值得麻煩,但如果你做到了,我希望看到代碼。

+2

在繪製這個圖之後,我意識到在你的情節中有一個'+',我之前沒有注意到它。我相信這些說明足以讓你用一個額外的「文本」來繪製它。 也檢查出[這個答案](http://stackoverflow.com/a/9185143/3540074),它提供了一種更優雅的方式來做到這一點,但我無法使它工作。 – kadu

1

您可以使用r'$\textcolor{blue}{e^{-x/5}} + \textcolor{green}{e^{-x/1}}$'將文本設爲藍色,半綠色。使用自己的代碼,例如:

enter image description here

是由下面的代碼生成的圖像。使用默認的matplotlibrc設置使用matplotlib v2.1.2進行測試。

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') 

主要是你的代碼有以下變化:

  1. 您需要使用pgf後端。
  2. Usepackage colorpgf.preamble
  3. 有一些重疊與第一和第二註釋,所以xytext改變。
  4. 第二個註釋中的color='g'實際上並沒有使用像rgb的(0,255,0)這樣純粹的「綠色」顏色。 \textcolor[rgb]{0.0, 0.5, 0.0}使它看起來一樣。
+0

謝謝,這個工程。在我自己的情況下,我在TeX中遇到了內存問題,可能是由於要在散點圖中繪製很多點。我用''lualatex''解決了'texsystem'問題。 – bli

+0

@bli,是的,那行'matplotlib.rc('pgf',texsystem ='pdflatex')'應該被刪除。我認爲默認的tex系統也可以。 – gepcel

相關問題