2012-04-23 71 views

Respuesta

11

¿Qué exactamente trataste?

¿Estaba usted, por casualidad, usando una cadena sin procesar (por ejemplo, r"whatever")?

'\n' funciona perfectamente, pero si usted está utilizando una cadena de texto para evitar secuencias de látex que se interpretan como un escape, que será interpretado por el pitón como '\' y 'n' en lugar de una nueva línea.

A modo de ejemplo:

import matplotlib.pyplot as plt 

plt.annotate('Testing\nThis\nOut', xy=(0.5, 0.5)) 

plt.show() 

enter image description here

Por otro lado, si se utiliza una cadena de texto:

import matplotlib.pyplot as plt 

plt.annotate(r'Testing\nThis\nOut', xy=(0.5, 0.5)) 

plt.show() 

enter image description here

+0

¿Qué ocurre si quiero mover el texto ** fuera ** de la figura? Esquina superior izquierda, por ejemplo? – FaCoffee

+1

@ FC84 - En ese caso, especifique la posición x, y del texto en las coordenadas de los ejes. Por ejemplo, esto colocaría el texto 5 _points_ a la derecha de la esquina superior derecha de los ejes: 'ax.annotate ('blah', xy = (1, 1), xytext = (5, 0), xycoords = ' fracción de ejes ', textcoords =' puntos de compensación ') ' –

7

Sin embargo, si necesitaba tanto , considere el siguiente ejemplo:

import matplotlib.pyplot as plt 

a = 1.23 
b = 4.56 

annotation_string = r"Need 1$^\mathsf{st}$ value here = %.2f" % (a) 
annotation_string += "\n" 
annotation_string += r"Need 2$^\mathsf{nd}$ value here = %.2f" % (b) 

plt.annotate(annotation_string, xy=(0.5, 0.5)) 

plt.show() 

que le ofrece:

enter image description here

La clave es ensamblar la cadena de antemano, utilizando +=. De esta forma, puede tener los comandos de cadena sin procesar (indicados por r) y el salto de línea (\n) en la misma anotación.

4

Puede utilizar las comillas triples cuando defina la cadena de anotación, como en string="""some text""", de modo que los saltos de línea reales que escriba en la cadena se interpretarán como saltos de línea en la salida.Este es un ejemplo, que incluye látex y la impresión de algunos parámetros numéricos de otras partes de su código

import matplotlib.pyplot as plt 

I = 100 
T = 20 

annotation_string = r"""The function plotted is: 
$f(x) \ = \ \frac{{I}}{{2}} \cos\left(2 \pi \ \frac{{x}}{{T}}\right)$ 

where: 
$I = ${0} 
$T = ${1}""".format(I, T) 

plt.annotate(annotation_string, xy=(0.05, 0.60), xycoords='axes fraction', 
              backgroundcolor='w', fontsize=14) 

plt.show() 

he añadido algunos "extras":

  • la r poco antes de la apertura de triple cotizaciones, para facilitar el intérprete LaTeX

  • los soportes dobles rizadas {{}}, por lo que el comando .format() y el látex no se metan entre sí

  • la opción xycoords='axes fraction', por lo que para especificar la posición de la cadena con valores fraccionales con respecto de la anchura y altura de la trama
  • la opción backgroundcolor='w', que pone una marquesina blanco alrededor la anotación (conveniente en caso de acumulación con su trama)

La trama obtenida es la siguiente: enter image description here

+1

¿Por qué la línea' $ I = $ {0} 'no se interpretó como látex entre los 2' $ 's? – Jason

+1

Lo hizo. Pensé que '.format()' usa '$ {}' como marcadores de posición. – Jason

+0

Hola Jason, de hecho, el "I =" entre el signo de dólar es interpretado por LaTeX, y se trazan en cursiva. Los valores numéricos no son, y de hecho no están en cursiva. No hay una razón particular por la que deje los valores numéricos. Lo siento si esto creó alguna confusión .. – Fabio

2

soluciones rápidas

plt.annotate("I am \n"+r"$\frac{1}{2}$"+"\n in latex math environment", xy=(0.5, 0.5))