2017-09-15 7 views
8

Ich versuche, eine polare "Sypter" -Darstellung zu machen, aber ich habe einige Probleme mit den Achsenbeschriftungen. Die Xaxis-Tick-Label scheinen immer auf einer Ebene unterhalb des Y-Achsen-Gitters zu enden (die Buchstaben sind durch die Gitterlinie abgedeckt, wie in der Abbildung unten gezeigt), ich möchte sie oben haben.Axis Label durch Achse in der Handlung versteckt?

Ich habe versucht, die Zorder aber ohne Erfolg einzustellen. Wenn ich die ZOrder der geplotteten Linien über 2 setze, gehen sie oben (in Bezug auf die Ebene) der Achse und des Gitters ... aber ich möchte immer noch, dass die Beschriftungen oben auf der Zeichnung sichtbar sind. Wenn ich sie unter 2 setze, gehen die Linien unter das Gitter. Das Festlegen der Zo- ordnung des Gitters oder der Tick-Labels scheint keine Auswirkungen zu haben.

Hier ist mein Versuch: Wie Sie sehen können, enden die roten Linien des Gitters oben auf dem Text "Industrie", während die graue Linie des Gitters darunter bleibt. Ich würde ‚Industrie‘ gerne sowohl Linie oben sein und von den Stellplätzen

import matplotlib.pyplot as plt 
import numpy as np 
import pandas as pd 
import random 

data = random.sample(range(100), 5) 
data[0] = 100 
data[3] = 50 
index = ['industry', 'residential', 'agriculture', 'transport', 'other'] 
df1 = pd.DataFrame(data, index=index, columns=['data']) 
df2 = pd.DataFrame(np.array(data)/2, index=index, columns=['data']) 

fig = plt.figure() 

ax = fig.add_subplot(111, projection="polar") 

ax.grid(True) 
ax.yaxis.grid(color='r') 
ax.xaxis.grid(color='#dddddd') 

for spine in ax.spines.values(): 
    spine.set_edgecolor('None') 

theta = np.arange(len(df1))/float(len(df1))*2.*np.pi 

l1, = ax.plot(theta, df1["data"], color="gold", marker="o", label=None, zorder=1) # , zorder = -3) 
l2, = ax.plot(theta, df2["data"], color='tomato', marker="o", label=None, zorder=1.1) #, zorder =-2) 

def _closeline(line): 
    x, y = line.get_data() 
    x = np.concatenate((x, [x[0]])) 
    y = np.concatenate((y, [y[0]])) 
    line.set_data(x, y) 
[_closeline(l) for l in [l1, l2]] 

ax.fill(theta, df1["data"], "gold", alpha=1, zorder=1) 
ax.fill(theta, df2["data"], 'tomato', alpha=1, zorder=1.1) 

ax.set_rlabel_position(216) 
ax.set_xticks(theta) 
ax.set_xticklabels(df2.index, fontsize=12)#, zorder=1) 

legend = plt.legend(handles=[l1,l2], labels =['first','second'], loc='lower right') 

plt.title("data [unit]", fontsize = 16, y = 1.2) 


plt.savefig('atlas//trial2.png', bbox_inches='tight', dpi = 300) 
plt.show() 

Here is my attempt: as you can see the red lines of the grid end up on top of the text 'industry' while the gray line of the grid stays below. I would like 'industry' to be on top of both line and of the plots

+1

Ich habe mehrere Kombinationen von 'zorder's ausprobiert, die _should_ Ihr Problem beeinflussen, vergeblich. Dies könnte ein ähnlicher Fehler sein (https://github.com/matplotlib/matplotlib/issues/5045). Polare Plots scheinen immer etwas problematischer zu sein als kartesische Plots. Kudos für die wohlgeformte Frage vervollständigen mit ausführbarem Beispiel! –

Antwort

0

Nun, das löst mein Problem, obwohl es nicht eine nette Antwort.

In dem obigen Skript ersetze ich ax.set_xticklabels(df2.index, fontsize=12) mit den folgenden, um Achsenbeschriftungen den entsprechenden Text zu ersetzen.

for it in np.arange(len(theta)): 
    txt = ax.text(theta[it], maxy*1.1, index[it], va = 'center', ha = 'center', fontsize = 12) 

ax.set_xticklabels('') 

Die 'Etiketten' befinden sich jetzt über der Achse und den Gittern.

+0

Wenn du deine Antwort akzeptierst, während sie eine Prämie hat, motivierst du vielleicht nicht wirklich andere Leute, sich mit dem Problem zu beschäftigen, da sie sehen, dass die Frage bereits eine akzeptierte Lösung hat. – ImportanceOfBeingErnest

+0

entfernt danke, war nur testen, ob ich die Punkte zurück bekommen würde :) – esperluette

+0

Nein, Punkte sind verloren, wenn Sie Ihre eigene Antwort akzeptieren. Wenn du die Antwort eines anderen akzeptierst, wird das für sie belohnt. – ImportanceOfBeingErnest