2017-06-20 2 views
3

Ich bin an den folgenden zwei Dinge für die Polarplot von matplotlib aufgetragen unten gezeigtWie kleinere Zecken für Polarplot matplotlib schaffen

  1. Wie kann ich für eine Polarplot auf der R-Achse kleinere Zecken schaffen?
  2. Wie verschiebe ich die R-Etiketten weiter weg von den R-Zecken, wie in der Grafik zu sehen, einige der R-Zecken sind in Kontakt mit der Achse.

enter image description here

Antwort

1

Die Polarplot nicht über kleinere oder größere Zecken. Also denke ich, dass Sie die kleinen Ticks manuell erstellen müssen, indem Sie kleine Liniensegmente zeichnen.

Zum Beispiel:

import numpy as np 
import matplotlib.pyplot as plt 

r = np.arange(0, 2, 0.01) 
theta = 2 * np.pi * r 

ax = plt.subplot(111, projection='polar') 
ax.plot(theta, r) 
ax.set_rmax(2) 
ax.margins(y=0) 
ax.set_rticks([0.5, 1, 1.5, 2]) # less radial ticks 
ax.set_rlabel_position(120) # get radial labels away from plotted line 

ax.grid(True) 

tick = [ax.get_rmax(),ax.get_rmax()*0.97] 
for t in np.deg2rad(np.arange(0,360,5)): 
    ax.plot([t,t], tick, lw=0.72, color="k") 

ax.set_title("A line plot on a polar axis", va='bottom') 
plt.show() 

enter image description here

0

Für Ihre erste Frage, können Sie entweder die Anzahl der Ticks erhöhen, die, wenn Sie für kleinere Zecken wollen scheint nicht zu sein, was Sie wollen, oder Sie können die Ticks manuell manuell generieren. Dazu müssen Sie die Polarachsen eigene Grundstück Einrichtungen nutzen diese Zecken plotten, dh:

ax.plot([theta_start, theta_end], [radius_start, radius_end], kwargs**) 

Sie benötigen, um das Intervall Sie diese Zecken wollen herausfinden, und dann kreuzen sie manuell mit einer Funktion wie der eine unten.

def minor_tick_gen(polar_axes, tick_depth, tick_degree_interval, **kwargs): 
    for theta in np.deg2rad(range(0, 360, tick_degree_interval)): 
     polar_axes.plot([theta, theta], [polar_axes.get_rmax(), polar_axes.get_rmax()-tick_depth], **kwargs) 

die Sie dann wie folgt aufrufen können:

minor_tick_gen(ax, 0.25, 20, color = "black") 

Seine Art schwer zu finden, aber polare Achse sind keine normalen Achsen, sondern Polar Axis class instances. In der Dokumentation können Sie set_ylim(min, max) verwenden, die Sie ermöglichen um die Beschriftungen von der Linie zu entfernen, wird dies jedoch den gesamten Graphen neu skalieren. Wenn Sie außerhalb der Grenzen des Diagramms arbeiten, benötigen Sie Entwicklerwissen über das Framework, da matplotlib diese Funktionalität Ihnen nicht zur Verfügung stellt. Wenn Sie beispielsweise set_rgrids(...) verwenden, wirkt sich auch bei einer Positionskomponente die relative Position der Etiketten nicht aus.

Setzt man diese Dinge zusammen, können Sie den folgenden Code verwenden:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.ticker as ticker 
import math 


def minor_tick_gen(polar_axes, tick_depth, tick_degree_interval, **kwargs): 
    for theta in np.deg2rad(range(0, 360, tick_degree_interval)): 
     polar_axes.plot([theta, theta], [polar_axes.get_rmax(), polar_axes.get_rmax()-tick_depth], **kwargs) 

def radian_function(x, y =None): 
    rad_x = x/math.pi 
    return "{}π".format(str(rad_x if rad_x % 1 else int(rad_x))) 

ax = plt.subplot(111, projection='polar') 
ax.set_rmax(2) 
ax.set_rticks([3*math.pi, 6*math.pi, 9*math.pi, 12*math.pi]) 
ax.set_rlabel_position(112.5) 
# go slightly beyond max value for ticks to solve second problem 
ax.set_ylim(0, 13*math.pi) 
ax.grid(True) 
# generate ticks for first problem 
minor_tick_gen(ax, math.pi, 20, color = "black", lw = 0.5) 
ax.set_title("Polar axis label minor tick example", va='bottom') 
ax.yaxis.set_major_formatter(ticker.FuncFormatter(radian_function)) 
ax.xaxis.set_major_formatter(ticker.FuncFormatter(radian_function)) 
plt.show() 

folgendes Bild zu erhalten enter image description here

Verwandte Themen