2017-04-01 6 views
0

Schauen Sie sich die Tabelle unten an. In diesem Diagramm möchte ich zeichnen, um mit den Mittelkoordinaten bei (45, 0) zu kreisen. Aber wie Sie sehen, ist die untere Grenze des Diagramms null und die Hälfte meines Kreises wird nicht angezeigt. Also, ich muss dieses Diagramm ein wenig nach unten erweitern. "Margins" Methode der Achsen (ax.margins()) funktioniert nicht, da die untere Zeile dieses Diagramms Null ist und Null multipliziert mit einer beliebigen Zahl gleich Null ist.Matplotlib Ränder

Hinweis: Bitte posten Sie keine Antworten wie ax.set_ylim (...) oder ax.set_yticks (...). Ich suche nach einer allgemeinen Lösung für diese Probleme.

Code 
import matplotlib.pyplot as plt 
import numpy as np 

values = np.array([0.00388632352941, 0.00375827941176, 0.00355033823529,  0.00328273529412, 0.00294677941176, 0.00272142647059, 0.00246463235294,  0.00227766176471, 0.00213151470588, 0.00202594117647, 0.00183544117647,  0.00162102941177, 0.00148372058824, 0.00128380882353, 0.00112252941176,  0.000931544117647, 0.000786573529412, 0.000658220588235, 0.000584485294118,  0.000524044117647, 0.000562485294118, 0.000716441176471, 0.000872617647059,  0.00109039705882, 0.00124138235294, 0.00136894117647, 0.00143985294118,  0.00134760294118, 0.00121794117647, 0.00112772058824, 0.00109435294118,  0.00102432352941, 0.00101069117647, 0.00102417647059, 0.00104895588235,  0.00101776470588, 0.00101494117647, 0.000885558823529, 0.00078075,  0.000752647058824, 0.000667691176471, 0.000593220588236, 0.000658647058823,  0.000742117647059, 0.000651470588235, 0.000604647058824, 0.000584573529412,  0.00049530882353, 0.000281235294118, 0.000355029411765]) 
fig, ax = plt.subplots() 
ax.bar(np.arange(values.shape[0]), values) 
plt.show() 

enter image description here

+0

Nicht sicher, wie groß Ihr Kreis ist. wenn es klein ist, schalten Sie einfach die Beschneidung für diesen Kreis aus. d.h. füge 'clip_on = False' hinzu. – klimaat

+0

Ich habe es versucht, aber kein Ergebnis. –

Antwort

1

In der Frage gibt es keinen Kreis, so meine Antwort entweder keinen Kreis enthalten.

Um etwas Platz um die Daten in der Handlung zu haben, können Sie ax.margins(y=ymargin) verwenden, wo ymargin der Anteil des Raumes auf jeder Seite der Daten hinzuzufügen ist. I.e. Wenn die Daten von 0 bis 1 gehen und Sie ymargin = 0.1 Rand hinzufügen, werden die Ylimits (-0.1, 1.1) sein. (Dies ist unabhängig davon, ob ein Grenzwert Null ist oder nicht.)

Jetzt funktioniert dies standardmäßig nicht für ein Balkendiagramm, da es im Allgemeinen unerwünscht wäre, wenn die Balken irgendwo beginnen würden die Luft, im Gegensatz zur unteren Achse. Dieses Verhalten wird mit einem Flag namens use_sticky_edges gesteuert. Wir können dieses Flag auf False setzen, um das Verhalten der Ränder zurückzubekommen, die an beiden Enden der Achse angewendet werden. Um wirksam zu werden, müssen wir danach ax.autoscale_view aufrufen.

import matplotlib.pyplot as plt 
import numpy as np 

values = np.array([3.89, 3.76, 3.55, 3.28, 2.95, 2.72, 2.46, 2.28, 2.13, 2.03, 1.84, 
        1.62, 1.48, 1.28, 1.12, 0.93, 0.79, 0.66, 0.58, 0.52, 0.56, 0.72, 
        0.87, 1.09, 1.24, 1.37, 1.44, 1.35, 1.22, 1.13, 1.09, 1.02, 1.01, 
        1.02, 1.05, 1.02, 1.01, 0.89, 0.78, 0.75, 0.67, 0.59, 0.66, 0.74, 
        0.65, 0.60, 0.58, 0.50, 0.28, 0.36]) 

fig, ax = plt.subplots() 
ax.bar(np.arange(values.shape[0]), values) 

ax.margins(y=0.3) 
ax.use_sticky_edges = False 
ax.autoscale_view(scaley=True) 
plt.show() 

enter image description here