2017-09-15 4 views
8

J'essaye de faire une intrigue polaire 'sypder' mais j'ai quelques problèmes avec les étiquettes d'axe. Les étiquettes de tôle xaxis semblent toujours se retrouver sur une couche en dessous de la grille de l'axe des y (les lettres sont couvertes par la ligne de la grille, comme le montre la figure ci-dessous), je les voudrais sur le dessus.Etiquette de l'axe cachée par l'axe dans l'intrigue?

J'ai essayé de régler les zorders mais sans succès. Si je mets la zordre des lignes tracées au-dessus de 2, elles vont en haut (en termes de calque) de l'axe et de la grille ... mais je veux quand même que les étiquettes soient visibles sur le tracé. Si je les place en dessous de 2, les lignes passent sous la grille. Définir la zord de la grille ou les étiquettes des tiques ne semble pas avoir d'effet.

Voici ma tentative: comme vous pouvez le voir, les lignes rouges de la grille se retrouvent au-dessus du texte «industrie» tandis que la ligne grise de la grille reste en dessous. Je voudrais « industrie » pour être au-dessus des deux lignes et des parcelles

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

J'ai essayé plusieurs combinaisons de 'zorder's qui pourraient affecter votre problème, en vain. Cela pourrait être un bug similaire [à celui-ci] (https://github.com/matplotlib/matplotlib/issues/5045). Les graphiques polaires semblent toujours un peu plus problématiques que les graphiques cartésiens. Bravo pour la question bien formée complète avec exemple exécutable! –

Répondre

0

Eh bien, cela résout mon problème, même si ce n'est pas une réponse agréable.

Dans le script ci-dessus, je remplace ax.set_xticklabels(df2.index, fontsize=12) par ce qui suit pour remplacer le texte équivalent par des étiquettes d'axe.

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

Les « étiquettes » sont maintenant au-dessus de l'axe et les grilles.

+0

Si vous acceptez votre réponse tant qu'elle contient une prime, vous ne motiverez peut-être plus personne d'autres personnes à se pencher sur le problème, car ils voient que la question a déjà une solution acceptée. – ImportanceOfBeingErnest

+0

enlevé merci, était juste de tester si j'allais récupérer les points :) – esperluette

+0

Non, les points sont perdus si vous acceptez votre propre réponse. Si vous acceptez la réponse de quelqu'un d'autre, la réponse sera récompensée. – ImportanceOfBeingErnest