2013-05-17 10 views
7

Mi chiedevo, è possibile compensare l'inizio dell'asse radiale o spostarlo all'esterno del grafico.Offset radiale dell'asse radiale polare Matplotlib

Questo è quello che spero di ottenere:

Goal

E questo è quello che ho per ora.

CurRes

Ho letto la documentazione e diversi argomenti su SO, ma non sono riuscito a trovare nulla di utile. Significa che non è nemmeno possibile se non è menzionato da nessuna parte.

Grazie in anticipo.

EDIT (frammento aggiunto di un codice utilizzato per creare la trama):

ax = fig.add_subplot(111, projection='polar') 
ax.set_theta_zero_location('N') 
ax.set_theta_direction(-1)  
ax.plot(X,lines[li]*yScalingFactor,label=linelabels[li],color=color,linestyle=ls) 
+0

Si prega di inviare il codice che ha prodotto il diagramma. –

+0

Il codice è standard per la stampa polare, ma ho comunque modificato il post e aggiunto il codice. E i dati non provengono da una formula, ma da un insieme di dati. – Renesis

risposta

6

io non sono sicuro se la polar plot può essere regolata come quella. Ma ecco una soluzione, basata su the last example given here: Floating Axes.

ho inserito commenti esplicativi nel codice, se si copia/incolla, dovrebbe funzionare così com'è:

import mpl_toolkits.axisartist.floating_axes as floating_axes 
from matplotlib.projections import PolarAxes 
from mpl_toolkits.axisartist.grid_finder import FixedLocator, \ 
    MaxNLocator, DictFormatter 
import numpy as np 
import matplotlib.pyplot as plt 

# generate 100 random data points 
# order the theta coordinates 

# theta between 0 and 2*pi 
theta = np.random.rand(100)*2.*np.pi 
theta = np.sort(theta) 

# "radius" between 0 and a max value of 40,000 
# as roughly in your example 
# normalize the r coordinates and offset by 1 (will be clear later) 
MAX_R = 40000. 
radius = np.random.rand(100)*MAX_R 
radius = radius/np.max(radius) + 1. 

# initialize figure: 
fig = plt.figure() 

# set up polar axis 
tr = PolarAxes.PolarTransform() 

# define angle ticks around the circumference: 
angle_ticks = [(0, r"$0$"), 
       (.25*np.pi, r"$\frac{1}{4}\pi$"), 
       (.5*np.pi, r"$\frac{1}{2}\pi$"), 
       (.75*np.pi, r"$\frac{3}{4}\pi$"), 
       (1.*np.pi, r"$\pi$"), 
       (1.25*np.pi, r"$\frac{5}{4}\pi$"), 
       (1.5*np.pi, r"$\frac{3}{2}\pi$"), 
       (1.75*np.pi, r"$\frac{7}{4}\pi$")] 

# set up ticks and spacing around the circle 
grid_locator1 = FixedLocator([v for v, s in angle_ticks]) 
tick_formatter1 = DictFormatter(dict(angle_ticks)) 

# set up grid spacing along the 'radius' 
radius_ticks = [(1., '0.0'), 
       (1.5, '%i' % (MAX_R/2.)), 
       (2.0, '%i' % (MAX_R))] 

grid_locator2 = FixedLocator([v for v, s in radius_ticks]) 
tick_formatter2 = DictFormatter(dict(radius_ticks)) 

# set up axis: 
# tr: the polar axis setup 
# extremes: theta max, theta min, r max, r min 
# the grid for the theta axis 
# the grid for the r axis 
# the tick formatting for the theta axis 
# the tick formatting for the r axis 
grid_helper = floating_axes.GridHelperCurveLinear(tr, 
                extremes=(2.*np.pi, 0, 2, 1), 
                grid_locator1=grid_locator1, 
                grid_locator2=grid_locator2, 
                tick_formatter1=tick_formatter1, 
                tick_formatter2=tick_formatter2) 

ax1 = floating_axes.FloatingSubplot(fig, 111, grid_helper=grid_helper) 
fig.add_subplot(ax1) 

# create a parasite axes whose transData in RA, cz 
aux_ax = ax1.get_aux_axes(tr) 

aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax 
ax1.patch.zorder=0.9 # but this has a side effect that the patch is 
        # drawn twice, and possibly over some other 
        # artists. So, we decrease the zorder a bit to 
        # prevent this. 

# plot your data: 
aux_ax.plot(theta, radius) 
plt.show() 

Questo genererà il seguente grafico:

pseudo polar plot

Dovresti modificare le etichette degli assi per soddisfare le tue richieste.
Ho ridimensionato i dati perché altrimenti si sarebbe verificato lo stesso problema con la trama: il cerchio interno vuoto sarebbe stato ridimensionato a un punto. Potresti provare il ridimensionamento con la trama polare e mettere le etichette personalizzate sull'asse radiale per ottenere un effetto simile.

+0

Non sono stato attivo da un po 'e non mi aspettavo che qualcuno potesse effettivamente aiutarlo. Questo in qualche modo aiuta e spero di essere in grado di modificarlo per essere come è necessario. – Renesis

+0

Penso che proverò a modificare questo lunedì, quindi riferirò i risultati. Grazie ancora una volta. – Renesis