2014-12-16 11 views
5

Die Daten, die ich visualisiere, sind nur sinnvoll, wenn es sich um ganze Zahlen handelt.Wie man matplotlib erzwingt, um nur ganze Zahlen auf der Y-Achse anzuzeigen

I.e. 0.2 eines Datensatzes macht keinen Sinn in Bezug auf den Kontext der Informationen, die ich analysiere.

Wie erzwinge ich Matplotlib, nur ganze Zahlen auf der Y-Achse zu verwenden. I.e. 1, 100, 5 usw.? nicht 0.1, 0.2 etc.

for a in account_list: 
    f = plt.figure() 
    f.set_figheight(20) 
    f.set_figwidth(20) 
    f.sharex = True 
    f.sharey=True 

    left = 0.125 # the left side of the subplots of the figure 
    right = 0.9 # the right side of the subplots of the figure 
    bottom = 0.1 # the bottom of the subplots of the figure 
    top = 0.9  # the top of the subplots of the figure 
    wspace = 0.2 # the amount of width reserved for blank space between subplots 
    hspace = .8 # the amount of height reserved for white space between subplots 
    subplots_adjust(left=left, right=right, bottom=bottom, top=top, wspace=wspace, hspace=hspace) 

    count = 1 
    for h in headings: 
     sorted_data[sorted_data.account == a].ix[0:,['month_date',h]].plot(ax=f.add_subplot(7,3,count),legend=True,subplots=True,x='month_date',y=h) 

     #set bottom Y axis limit to 0 and change number format to 1 dec place. 
     axis_data = f.gca() 
     axis_data.set_ylim(bottom=0.) 
     from matplotlib.ticker import FormatStrFormatter 
     axis_data.yaxis.set_major_formatter(FormatStrFormatter('%.0f')) 

     #This was meant to set Y axis to integer??? 
     y_formatter = matplotlib.ticker.ScalarFormatter(useOffset=False) 
     axis_data.yaxis.set_major_formatter(y_formatter) 

     import matplotlib.patches as mpatches 

     legend_name = mpatches.Patch(color='none', label=h) 
     plt.xlabel("") 
     ppl.legend(handles=[legend_name],bbox_to_anchor=(0.,1.2,1.0,.10), loc="center",ncol=2, mode="expand", borderaxespad=0.) 
     count = count + 1 
     savefig(a + '.png', bbox_inches='tight') 
+0

Nicht sicher, warum Sie downvoted werden. Es ist eine gute, klare Frage mit einer nicht ganz offensichtlichen Antwort (abgesehen von der manuellen Einstellung der Ticks, die unflexibel ist). –

Antwort

1

Sie können Tickbeschriftungen/-nummern wie folgt ändern. Dies ist nur ein Beispiel, da Sie keinen Code zur Verfügung gestellt haben, der Ihnen zur Verfügung steht, also nicht sicher, ob er für Sie gilt oder nicht.

import matplotlib.pyplot as plt 

fig, ax = plt.subplots() 

fig.canvas.draw() 

# just the original labels/numbers and modify them, e.g. multiply by 100 
# and define new format for them. 
labels = ["{:0.0f}".format(float(item.get_text())*100) 
       for item in ax.get_xticklabels()] 


ax.set_xticklabels(labels) 

plt.show() 

ohne Änderungen x-Achse:

enter image description here

mit der Modifikation:

enter image description here

10

Die flexibelste Weise integer=True auf den Standard tick-Locator angeben ist (MaxNLocator) tun Sie etwas ähnliches:

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

fig, ax = plt.subplots() 

# Be sure to only pick integer tick locations. 
for axis in [ax.xaxis, ax.yaxis]: 
    axis.set_major_locator(ticker.MaxNLocator(integer=True)) 

# Plot anything (note the non-integer min-max values)... 
x = np.linspace(-0.1, np.pi, 100) 
ax.plot(0.5 * x, 22.8 * np.cos(3 * x), color='black') 

# Just for appearance's sake 
ax.margins(0.05) 
ax.axis('tight') 
fig.tight_layout() 

plt.show() 

enter image description here

Alternativ können Sie auch manuell die Zecke Positionen einstellen/Labels wie Marcin und Joel vorschlagen (oder eine MultipleLocator verwenden). Der Nachteil dabei ist, dass Sie herausfinden müssen, welche Tick-Positionen sinnvoll sind, anstatt dass Matplotlib ein vernünftiges Integer-Tick-Intervall basierend auf den Achsenlimits wählt.

+0

Danke @Joe Kington - Kannst du mir helfen? Ich fühle, dass ich es falsch gebrauche: Ich bekomme den Fehler: axis_data.set_major_locator (ticker.MaxNLocator (integer = True)) 'AxesSublot' Objekt hat kein Attribut 'set_major_locator'. Liegt das daran, dass ich versuche, die Y-Achse auf ganze Zahlen für UNTERPLÖNE zu setzen? – yoshiserry

+0

@yoshiserry - Ich vermute, dass Sie versuchen, 'ax.set_major_locator' anstelle von' ax.yaxis.set_major_locator' aufzurufen. Der Tick-Lokator ist ein Attribut der "Achse" (d. H. X/y-Achse), nicht die "Achsen" (d. H. Die Darstellung). Versuchen Sie 'axis_data.yaxis.set_major_locator' (oder' xaxis', abhängig). –

1

Wenn es nur die yaxis Sie, eine einfache Möglichkeit, sich ändern wollen, ist zu bestimmen, welche Zecken Sie wollen:

tickpos = [0,1,4,6] 

py.yticks(tickpos,tickpos) 

Zecken bei 0 gesetzt wird, 1, 4 und 6. Allgemeiner

py.yticks([0,1,2,3], ['zero', 1, 'two', 3.0]) 

wird das Etikett der zweiten Liste an den Ort in der ersten Liste setzen. Wenn das Label der yvalue sein soll, ist es eine gute Idee, die py.yticks(tickpos,tickpos) Version zu verwenden, nur um sicherzustellen, dass die Labels die gleiche Änderung erhalten, wenn Sie die Positionen der Ticks ändern.

Allgemeiner gesagt, Kingtons Antwort lässt Sie pylab nur ganze Zahlen für die y-Achse angeben, aber lassen Sie es wählen, wohin die Ticks gehen.

Verwandte Themen