Matplotlib dos colores diferentes en el mismo anotado

Estoy tratando de crear una figura en python y make es para que el mismo texto de la coma tenga dos colores, la mitad de la annonate será azul y la otra mitad será roja.

Creo que el código se explica solo. Tengo 3 líneas 1 verde con annonate verde, 1 azul con annonate azul.

El tercero es rojo, es la sum de la ttwig 1 y la ttwig 2, y quiero que tenga medio color azul y mitad verde.

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

¿Es posible?

Puede usar r'$\textcolor{blue}{e^{-x/5}} + \textcolor{green}{e^{-x/1}}$' para hacer que el texto sea mitad azul, mitad verde. Usando su propio código por ejemplo:

introduzca la descripción de la imagen aquí

La imagen es generada por el siguiente código. Testd con matplotlib v2.1.2 con la configuración predeterminada de 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') 

Es principalmente su código con los siguientes cambios:

  1. Necesitas usar un backend pgf .
  2. Use el color pgf.preamble en pgf.preamble
  3. Hay algunas coincidencias con las anotaciones 1 y 2, por xytext se cambia xytext .
  4. El color='g' en la segunda anotación en realidad no usó el color “Verde” puro como (0, 255, 0) de rgb. \textcolor[rgb]{0.0, 0.5, 0.0} hace que se vea igual.

No creo que pueda tener varios colores en una sola anotación, ya que, por lo que sé, annotate solo toma un objeto de texto como parámetro, y los objetos de texto solo admiten colores individuales. Por lo tanto, que yo sepa, no hay una forma “nativa” o “elegante” de hacer esto automáticamente.

Sin embargo, hay una solución alternativa: puede tener varios objetos de texto colocados arbitrariamente en el gráfico. Así que así es como lo haría:

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

Lo que hice fue:

  1. Pongo la anotación color='black' ;
  2. fig1 los dos objetos de texto en las posiciones 0.5, 0.5 (lo que significa el centro de fig1 );
  3. Cambié manualmente las posiciones hasta que se superponen aproximadamente con el texto negro generado por annotate (que terminó siendo los valores que se ven en las dos llamadas a text );
  4. Configuré la anotación color='white' , para que no interfiera con el color del texto superpuesto.

Aquí está la salida:

gráfico anotado multicolor

No es muy elegante, y requiere un poco de trazado para afinar las posiciones, pero hace el trabajo.

Si necesita varios gráficos, tal vez haya una forma de automatizar la ubicación: si no almacena el objeto fig1 , las coordenadas del text convierten en las coordenadas x, y reales en el gráfico; me parece un poco más difícil trabajar con él. ¿Pero tal vez te permitiría generarlos automáticamente usando las coordenadas xy la anotación? No me parece que valga la pena, pero si lo haces, me gustaría ver el código.