2013-06-18 15 views
10

C'è un modo per aumentare il padding/offset delle etichette tick polare plot (theta)?matplotlib: aggiunta di padding/offset a plot polari etichette tick

import matplotlib 
import numpy as np 
from matplotlib.pyplot import figure, show, grid 

# make a square figure 
fig = figure(figsize=(2, 2)) 
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8], polar=True, axisbg='#d5de9c') 
ax.set_yticklabels([]) 

r = np.arange(0, 3.0, 0.01) 
theta = 2*np.pi*r 
ax.plot(theta, r, color='#ee8d18', lw=3) 
ax.set_rmax(2.0) 
show() 

Mi piacerebbe avere theta etichette delle tacche più lontano dal diagramma polare in modo che non si sovrappongano.

enter image description here

risposta

11

Prima di tutto; visto che come hai specificato che lo figsize è (2,2) e che l'ax occupa l'80% sia della larghezza che dell'altezza, hai molto poco spazio rimasto per riempire i ticklabels. Questo potrebbe far sì che i ticklabels siano "tagliati" agli ego della figura. Questo può facilmente essere "fisso" di entrambi i

  • Specificando più grande figsize
  • Fai il ax occupano meno spazio sul (2,2) figura dimensioni
  • Usa Caratteri più piccoli per i ticklabels

o qualsiasi combinazione di questi. Un altro, a mio avviso migliore, la soluzione a questo "problema" consiste nell'utilizzare una sottotrama piuttosto che specificare i limiti dello Axes;

ax = fig.add_subplot(111, polar=True, axisbg='#d5de9c') 

quanto ciò rende possibile utilizzare il metodo tight_layout() che configura automaticamente il layout figura ben per includere tutti gli elementi.

Quindi al problema reale a portata di mano; l'imbottitura. Su un PolarAxes è possibile impostare, tra le altre cose, il posizionamento radiale dei teta-tick. Questo viene fatto specificando la frazione del raggio degli assi polari in cui si desidera posizionare i segni di spunta come argomento per il parametro frac del metodo set_thetagrids()PolarAxes. L'argomento dovrebbe essere una frazione del raggio degli assi in cui si desidera posizionare i ticklabels. Cioè per frac < 1 i ticklabels verranno posizionati all'interno degli assi, mentre per frac> 1 verranno posizionati all'esterno degli assi.

Il vostro codice potrebbe quindi essere qualcosa di simile:

import numpy as np 
from matplotlib.pyplot import figure, show, grid, tight_layout 
# make a square figure 
fig = figure(figsize=(2, 2)) 
ax = fig.add_subplot(111, polar=True, axisbg='#d5de9c') 
ax.set_yticklabels([]) 

r = np.arange(0, 3.0, 0.01) 
theta = 2*np.pi*r 
ax.plot(theta, r, color='#ee8d18', lw=3) 
ax.set_rmax(2.0) 

# tick locations 
thetaticks = np.arange(0,360,45) 

# set ticklabels location at 1.3 times the axes' radius 
ax.set_thetagrids(thetaticks, frac=1.3) 

tight_layout() 

show() 

PolarAxes with frac=1.3

Si dovrebbe provare diversi valori per frac per trovare un valore che è più adatto per le vostre esigenze.

Se non si specifica un valore per il parametro frac come sopra, ad esempio frac ha il valore predefinito None, il codice genera un grafico come riportato di seguito. Nota come il raggio della trama è più grande, in quanto i ticklabels non "occupano tanto spazio" come nell'esempio sopra.

PolarAxes with frac=None

+0

wow, una spiegazione sorprendente! grazie mille! – dimka

+0

Sai cos'è il 'frac' predefinito? – Annan

+0

@Annan Da [questo] (https://github.com/matplotlib/matplotlib/blob/ff31d67a8103620221a3eeadeb985e8268a7d934/doc/users/whats_new.rst#enhancements-to-polar-plot) sembra che 'frac' sia deprecato. "[...] Di conseguenza, l'argomento' frac' su .PolarAxes.set_thetagrids non viene più applicato. Il riempimento del segno di spunta può essere modificato con l'argomento 'pad' su .Axes.tick_params o .Axis.set_tick_params." – hooy

Problemi correlati