2012-04-23 12 views

Odpowiedz

11

Co dokładnie wypróbowałeś?

Czy przez przypadek używasz nieprzetworzonego ciągu znaków (np. r"whatever")?

'\n' działa idealnie, ale jeśli używasz surowy ciąg uniknąć sekwencje lateksowe są interpretowane jako ucieczka, to będzie interpretowane przez pytona jako '\' i 'n' zamiast nowej linii.

Jako przykład:

import matplotlib.pyplot as plt 

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

plt.show() 

enter image description here

Z drugiej strony, jeśli używamy surowego ciąg:

import matplotlib.pyplot as plt 

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

plt.show() 

enter image description here

+0

Co zrobić, jeśli chcę przenieść tekst ** na zewnątrz ** rysunku? W lewym górnym rogu, na przykład? – FaCoffee

+1

@ FC84 - W tym przypadku określ pozycję x, y tekstu w współrzędnych osi. Na przykład, umieściłby on tekst 5 _points_ na prawo od górnego prawego rogu osi: 'ax.annotate ('blah', xy = (1, 1), xytext = (5, 0), xycoords = ' axes fraction ", textcoords =" punkty odsunięcia ")' –

7

Jeśli jednak potrzebne zarówno , rozważ następujący przykład:

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

co daje:

enter image description here

Kluczem jest zebranie ciąg wcześniej, korzystając +=. W ten sposób możesz mieć polecenia raw-string (wskazane przez r) i line-break (\n) w tej samej adnotacji.

4

Możesz użyć potrójnych cudzysłowów podczas definiowania ciągu adnotacji, tak jak w string="""some text""", tak że faktyczne łamanie linii w łańcuchu zostanie zinterpretowane jako zerwania linii na wyjściu.Oto przykład, który zawiera lateksu i drukowanie niektórych parametrów liczbowych z innych części kodu

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

Dodałem kilka „dodatki”:

  • r wkrótce przed otwarciem potrójnej cytaty, aby ułatwić tłumacza LaTeX

  • podwójne wsporniki {{}} kręcone, tak że polecenie .format() i lateksu nie zadzieraj z siebie

  • opcja xycoords='axes fraction', tak aby określić położenie ciąg o wartościach ułamkowych względem szerokości i wysokości działki
  • opcję backgroundcolor='w', które stawia białą ramkę wokół adnotacji (wygodny w przypadku kumulacji z twojej działki)

otrzymany fabuła jest tak: enter image description here

+1

Dlaczego linia '$ I = $ {0}' nie została zinterpretowana jako Latex pomiędzy 2 '$' s? – Jason

+1

To się stało. Myślałem, że '.format()' używa '$ {}' jako obiektów zastępczych. – Jason

+0

Witaj Jason, rzeczywiście, "I =" między znakiem dolara są interpretowane przez LaTeX, a są one drukowane kursywą. Wartości liczbowe nie są i nie są kursywą. Nie ma szczególnego powodu, dla którego zostawiłem wartości liczbowe na zewnątrz. Przepraszam, jeśli to spowodowało zamieszanie. – Fabio

2

Szybkie rozwiązania

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

Powiązane problemy