2015-04-21 20 views
7

Próbuję adnotować tekst na działkach, aby śledzić krzywiznę linii. Mam następujące działki:Jak opisywać tekst wzdłuż zakrzywionych linii w Pythonie?

enter image description here

I to jest to, co chcę uzyskać, jeśli to naprawić konkretną wartość y dla adnotacji, dla każdej krzywej należy umieścić adnotację wzdłuż krzywej w wymaganej stoku (to znaczy należy do krzywizny krzywej), jak pokazano poniżej:

enter image description here

Kod powtarzalne dla powierzchni bez opisów jest:

import numpy as np 
import matplotlib.pyplot as plt 

x = np.array([[53.4, 57.6, 65.6, 72.9], 
      [60.8, 66.5, 73.1, 83.3], 
      [72.8, 80.3, 87.2, 99.3], 
      [90.2, 99.7, 109.1, 121.9], 
      [113.6, 125.6, 139.8, 152]]) 

y = np.array([[5.7, 6.4, 7.2, 7.8], 
      [5.9, 6.5, 7.2, 7.9], 
      [6.0, 6.7, 7.3, 8.0], 
      [6.3, 7.0, 7.6, 8.2], 
      [6.7, 7.5, 8.2, 8.7]]) 

plt.figure(figsize=(5.15, 5.15)) 
plt.subplot(111) 
for i in range(len(x)): 
    plt.plot(x[i, :] ,y[i, :]) 
plt.xlabel('X') 
plt.ylabel('Y') 
plt.show() 

Jak umieścić takie teksty w Pythonie przy pomocy matplotlib?

Odpowiedz

5

można uzyskać kąt nachylenia w stopniach i użyć jej w matplotlib.text.Text z obracania argumentu

rotn = np.degrees(np.arctan2(y[:,1:]-y[:,:-1], x[:,1:]-x[:,:-1])) 

EDIT: tak to jest trochę bałaganu niż sugerowane jako działki jest skalowany w celu dopasowania danych i ma marże itd ale masz pomysł

... 
plt.figure(figsize=(7.15, 5.15)) #NB I've changed the x size to check it didn't distort 
plt.subplot(111) 
for i in range(len(x)): 
    plt.plot(x[i, :] ,y[i, :]) 

rng = plt.axis() 
x_scale = 7.15 * 0.78/(rng[1] - rng[0])   
y_scale = 5.15 * 0.80/(rng[3] - rng[2])   
rotn = np.degrees(np.arctan2((y[:,1:]-y[:,:-1]) * y_scale, 
           x[:,1:]-x[:,:-1]) * x_scale) 
labls = ['first', 'second', 'third', 'fourth', 'fifth'] 
for i in range(len(x)): 
    plt.annotate(labls[i], xy=(x[i,2], y[i,2]), rotation=rotn[i,2]) 

plt.xlabel('X') 

RE-EDIT zauważył, że skalowanie było źle, ale po prostu się do pracy przez przypadek! Również wartości xy etykiet są trochę przybliżone z powodu skalowania.

+0

Jak otrzymałeś wartości 7.15, 5.15 i 1.5? –

+0

dobry punkt. Moje parsimony z kopią wklejają kod, który testowałem! Będę teraz ponownie edytować, aby dodać brakujący bit. Odejmowanie 1,5 jest przybliżeniem, aby uzyskać rzeczywisty obszar wykresu. Prawdopodobnie w matplotlib istnieje metoda, która robi to za Ciebie. Alternatywnie może użyć proporcji, w którym to przypadku możesz * 0,7 lub cokolwiek innego, – paddyg

+0

PS po prostu sprawdził matplotlib, a subpozycja wydaje się mieć marginesy 0.12l, 0.9r, 0.1b, 0.9t i używanie 7.15 * 0.78 i 5.15 * 0.8 wydaje siędziałać całkiem dobrze – paddyg