2017-05-11 4 views
0

Ich habe Schwierigkeiten mit der Textausrichtung in Pyplot. Ich versuche, kreisförmig angeordnete Punkte in einem kreisförmigen Dendrogramm zu kommentieren, daher ist es wichtig, dass die Markierungen von den Punkten weg zeigen und den rechten Winkel beibehalten. Hier ist der relevante Teil von dem, was ich bisher habe. dots in a circleAusrichten von Etiketten in einem Kreis in Matplotlib

Die horizontalen Etiketten funktionieren wie ein Charme, aber die vertikalen sind offensichtlich ausgeschaltet. Es scheint, dass horizontalalignment/verticalalignment auf die ursprünglichen Koordinaten und auf die Bounding-Box angewendet wird. Gibt es eine Möglichkeit/Möglichkeit, die Etiketten richtig auszurichten, ohne einige verrückte Stunts durchzuführen, z. B. die Texthöhe herauszufinden und die Etiketten entsprechend zu verschieben. Ich habe mich gefragt, ob es sinnvoll wäre, eine zweite Parzelle/Achse mit Polarkoordinaten zu überlagern und den Text darauf zu setzen, aber ich bin mir nicht sicher, ob mich das irgendwohin führen wird. Oder ob ich fehle etwas wirklich offensichtlich ...

Hier ist ein minimales Arbeitsbeispiel:

import matplotlib.pyplot as plt 

(fig, ax) = plt.subplots(figsize = (4,4)) 

def kex(N): 
    alpha = 360./N 
    coordX = [] 
    coordY = [] 
    alphas = [] 
    for i in range(0,N): 
     alpha_loop = alpha * i 
     coordX.append(math.cos(math.radians(alpha_loop))) 
     coordY.append(math.sin(math.radians(alpha * i))) 
     alphas.append(alpha_loop) 
    return [coordX, coordY, alphas] 

N = 10 
points = kex(N) 
ax.scatter(points[0], points[1]) 
for i in range(0,N): 
    x = points[0][i] 
    y = points[1][i] 
    a = points[2][i] 
    if x > 0: 
     ax.text(x + x * 0.1, y + y * 0.1, "AAA", rotation = a, 
        bbox=dict(facecolor = "none", edgecolor ="red")) 
    else: 
     ax.text(x + x * 0.1, y + y * 0.1, "AAA", rotation = a - 180, 
        bbox=dict(facecolor = "none", edgecolor ="red"), ha = "right") 

ax.axis("off") 

plt.show() 

Jede Hilfe ist willkommen!

+0

Siehe auch http://stackoverflow.com/questions/43894987/networkx-node-labels-relative-position – ImportanceOfBeingErnest

Antwort

2

Sie können den Text so weit verschieben, dass er sich nicht mit den Punkten überschneidet. Die Idee ist dann, den Text so zu zentrieren (ha="center", va="center"), dass er auf einer verlängerten (virtuellen) Linie zwischen dem Mittelpunkt des Graphen und dem Punkt, den er kennzeichnet, sitzt.

import matplotlib.pyplot as plt 
import numpy as np 

(fig, ax) = plt.subplots(figsize = (4,4)) 

def kex(N): 
    alpha=2*np.pi/N 
    alphas = alpha*np.arange(N) 
    coordX = np.cos(alphas) 
    coordY = np.sin(alphas) 

    return np.c_[coordX, coordY, alphas] 

N = 10 
r = 1.2 
points = kex(N) 
ax.scatter(points[:,0], points[:,1]) 

for i in range(0,N): 
    a = points[i,2] 
    x,y = (r*np.cos(a), r*np.sin(a)) 
    if points[i,0] < 0: a = a - np.pi 
    ax.text(x,y, "AAA", rotation = np.rad2deg(a), ha="center", va="center", 
        bbox=dict(facecolor = "none", edgecolor ="red")) 

ax.axis("off") 

plt.show() 

enter image description here

+0

Ich habe eingestellt besser nicht den Offset um das Problem zu veranschaulichen. Aber das Setzen von "ha" und "va" auf "center" macht den Trick. Danke vielmals! –

+0

Ich brauchte einige Zeit, um herauszufinden, was der Unterschied war, also wollte ich andere Leute, die mit dem Problem konfrontiert waren, einige Zeit verschonen. –

Verwandte Themen