788 Stimmen

Ändern der Tickfrequenz auf der x- oder y-Achse

Ich versuche zu reparieren, wie Python meine Daten aufzeichnet. Sagen wir:

x = [0,5,9,10,15]
y = [0,1,2,3,4]

matplotlib.pyplot.plot(x,y)
matplotlib.pyplot.show()

Die Ticks der X-Achse werden in 5er-Intervallen aufgetragen. Gibt es eine Möglichkeit, Intervalle von 1 darzustellen?

42voto

choldgraf Punkte 3217

Das ist zwar etwas umständlich, aber bei weitem das sauberste und am einfachsten zu verstehende Beispiel, das ich dafür gefunden habe. Es ist von einer Antwort auf SO hier:

Sauberste Weg, um jede n-te Tick-Label in Matplotlib-Farbbalken ausblenden?

for label in ax.get_xticklabels()[::2]:
    label.set_visible(False)

Dann können Sie die Beschriftungen in einer Schleife durchlaufen und sie je nach gewünschter Dichte sichtbar oder unsichtbar machen.

edit: beachten Sie, dass matplotlib manchmal Labels setzt == '' Es könnte also so aussehen, als ob ein Etikett nicht vorhanden wäre, obwohl es tatsächlich vorhanden ist und nur nichts anzeigt. Um sicherzugehen, dass Sie eine Schleife durch die tatsächlich sichtbaren Beschriftungen ziehen, können Sie es versuchen:

visible_labels = [lab for lab in ax.get_xticklabels() if lab.get_visible() is True and lab.get_text() != '']
plt.setp(visible_labels[::2], visible=False)

19voto

Tompa Punkte 4741

Dies ist ein altes Thema, aber ich stolpere ab und zu darüber und habe diese Funktion entwickelt. Sie ist sehr praktisch:

import matplotlib.pyplot as pp
import numpy as np

def resadjust(ax, xres=None, yres=None):
    """
    Send in an axis and I fix the resolution as desired.
    """

    if xres:
        start, stop = ax.get_xlim()
        ticks = np.arange(start, stop + xres, xres)
        ax.set_xticks(ticks)
    if yres:
        start, stop = ax.get_ylim()
        ticks = np.arange(start, stop + yres, yres)
        ax.set_yticks(ticks)

Ein Nachteil dieser Art der Steuerung der Ticks ist, dass man nicht mehr in den Genuss der interaktiven automatischen Aktualisierung der maximalen Skala nach einer hinzugefügten Zeile kommt. Dann tun

gca().set_ylim(top=new_top) # for example

und führen Sie die Funktion "Neu einstellen" erneut aus.

13voto

Deninhos Punkte 629

Ich habe eine unelegante Lösung entwickelt. Nehmen wir an, wir haben die X-Achse und auch eine Liste von Beschriftungen für jeden Punkt in X.

Exemple :

import matplotlib.pyplot as plt

x = [0,1,2,3,4,5]
y = [10,20,15,18,7,19]
xlabels = ['jan','feb','mar','apr','may','jun']

Angenommen, ich möchte nur für die Monate "Feb" und "Juni" Zeckenbeschriftungen anzeigen.

xlabelsnew = []
for i in xlabels:
    if i not in ['feb','jun']:
        i = ' '
        xlabelsnew.append(i)
    else:
        xlabelsnew.append(i)

Gut, jetzt haben wir eine gefälschte Liste von Etiketten. Zuerst haben wir die ursprüngliche Version gezeichnet.

plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabels,rotation=45)
plt.show()

Und nun die geänderte Version.

plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabelsnew,rotation=45)
plt.show()

11voto

Johnny V Punkte 1008

Generalisierbarer One-Liner, der nur Numpy importiert:

ax.set_xticks(np.arange(min(x),max(x),1))

Einordnen in den Kontext der Frage:

import numpy as np
import matplotlib.pyplot as plt 
fig, ax = plt.subplots()
x = [0,5,9,10,15]
y = [0,1,2,3,4]
ax.plot(x,y)
ax.set_xticks(np.arange(min(x),max(x),1))
plt.show()

Wie es funktioniert:

  1. fig, ax = plt.subplots() liefert das ax-Objekt, das die Achsen enthält.
  2. np.arange(min(x),max(x),1) ergibt ein Array des Intervalls 1 vom Minimalwert von x bis zum Maximalwert von x. Das sind die neuen x Ticks, die wir haben wollen.
  3. ax.set_xticks() ändert die Häkchen am Objekt ax.

9voto

Greenstick Punkte 7799

Reine Python-Implementierung

Im Folgenden finden Sie eine reine Python-Implementierung der gewünschten Funktionalität, die beliebige numerische Reihen (int oder float) mit positiven, negativen oder gemischten Werten verarbeitet und dem Benutzer die Möglichkeit gibt, die gewünschte Schrittgröße anzugeben:

import math

def computeTicks (x, step = 5):
    """
    Computes domain with given step encompassing series x
    @ params
    x    - Required - A list-like object of integers or floats
    step - Optional - Tick frequency
    """
    xMax, xMin = math.ceil(max(x)), math.floor(min(x))
    dMax, dMin = xMax + abs((xMax % step) - step) + (step if (xMax % step != 0) else 0), xMin - abs((xMin % step))
    return range(dMin, dMax, step)

Beispielhafte Ausgabe

# Negative to Positive
series = [-2, 18, 24, 29, 43]
print(list(computeTicks(series)))

[-5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45]

# Negative to 0
series = [-30, -14, -10, -9, -3, 0]
print(list(computeTicks(series)))

[-30, -25, -20, -15, -10, -5, 0]

# 0 to Positive
series = [19, 23, 24, 27]
print(list(computeTicks(series)))

[15, 20, 25, 30]

# Floats
series = [1.8, 12.0, 21.2]
print(list(computeTicks(series)))

[0, 5, 10, 15, 20, 25]

# Step – 100
series = [118.3, 293.2, 768.1]
print(list(computeTicks(series, step = 100)))

[100, 200, 300, 400, 500, 600, 700, 800]

Verwendungsbeispiele

import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(computeTicks(x))
plt.show()

Plot of sample usage

Beachten Sie, dass die x-Achse ganzzahlige Werte hat, die alle gleichmäßig durch 5 getrennt sind, während die y-Achse ein anderes Intervall hat (die matplotlib Standardverhalten, da die Häkchen nicht angegeben wurden).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X