Zmiana "częstotliwości kleszczowej" na osi x lub y w matplotlib?

Próbuję naprawić sposób, w jaki python wykreśla moje dane.

Powiedz

x = [0,5,9,10,15]

I

y = [0,1,2,3,4]

Wtedy zrobiłbym:

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

I kleszcze osi x są wykreślane w odstępach 5. Czy jest sposób, aby wyświetlać interwały 1?

Author: Daan, 2012-09-26

9 answers

Możesz wyraźnie ustawić miejsce, w którym chcesz zaznaczyć znaki za pomocą plt.xticks:

plt.xticks(np.arange(min(x), max(x)+1, 1.0))

Na przykład,

import numpy as np
import matplotlib.pyplot as plt

x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
plt.show()

(np.arange została użyta zamiast funkcji range Pythona na wypadek, gdyby min(x) i max(x) były pływakami zamiast intami.)


Funkcja plt.plot (lub ax.plot) automatycznie ustawi domyślne limity x i y. Jeśli chcesz zachować te limity i po prostu zmienić rozmiar stopni znaków kleszcza, możesz użyć ax.get_xlim(), aby dowiedzieć się, jakie limity Matplotlib już ustawiony.

start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, stepsize))

Domyślny program do formatowania tick powinien wykonać przyzwoitą pracę zaokrąglając wartości tick do rozsądnej liczby znaczących cyfr. Jeśli jednak chcesz mieć większą kontrolę nad formatem, możesz zdefiniować swój własny program do formatowania. Na przykład,

ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))

Oto przykład:

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

x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, 0.712123))
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))
plt.show()
 347
Author: unutbu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-01 17:50:35

Innym podejściem jest ustawienie lokalizatora osi:

import matplotlib.ticker as plticker

loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)

Istnieje kilka różnych typów lokalizatorów w zależności od potrzeb.

 135
Author: robochat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-14 08:38:42

Podoba mi się to rozwiązanie (z Matplotlib):

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

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

tick_spacing = 1

fig, ax = plt.subplots(1,1)
ax.plot(x,y)
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
plt.show()

To rozwiązanie daje wyraźną kontrolę odstępów między kleszczami za pomocą liczby podanej ticker.MultipleLocater(), umożliwia automatyczne wyznaczanie granic i jest łatwe do odczytania później.

 71
Author: jthomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-25 23:24:37

Jeśli ktoś jest zainteresowany ogólnym jednoliniowym, po prostu pobierz aktualne kleszcze i użyj go, aby ustawić nowe kleszcze, pobierając próbki co drugi kleszcz.

ax.set_xticks(ax.get_xticks()[::2])
 45
Author: glopes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-15 11:46:09

To jest trochę chwiejne, ale zdecydowanie najczystszy / najłatwiejszy do zrozumienia przykład, który znalazłem, aby to zrobić. To z odpowiedzi na tak tutaj:

Najczystszy sposób na ukrycie każdej n-tej etykiety w pasku kolorów matplotlib?

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

Następnie możesz zapętlić etykiety ustawiając je na widoczne lub nie, w zależności od pożądanej gęstości.

Edit: zauważ, że czasami matplotlib ustawia etykiety == '', więc może to wyglądać tak, jakby etykieta nie była obecna, kiedy w rzeczywistości jest i po prostu nie jest wyświetlanie czegokolwiek. Aby upewnić się, że zapętlasz rzeczywiste widoczne etykiety, możesz spróbować:

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)
 23
Author: choldgraf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:53

To stary temat, ale potykam się o to od czasu do czasu i stworzyłem tę funkcję. To bardzo wygodne:

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)

Jednym z zastrzeżeń kontrolowania kleszczy jest to, że nie cieszy się już interaktywną automatyczną aktualizacją maksymalnej skali po dodanej linii. Następnie wykonaj

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

I uruchom ponownie funkcję resadjust.

 10
Author: Tompa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-02 10:04:17

Opracowałem nieeleganckie rozwiązanie. Rozważmy, że mamy oś X, a także listę etykiet dla każdego punktu w X.

Przykład:
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']
Powiedzmy, że chcę pokazać etykiety kleszczy tylko dla " feb " i "jun"
xlabelsnew = []
for i in xlabels:
    if i not in ['feb','jun']:
        i = ' '
        xlabelsnew.append(i)
    else:
        xlabelsnew.append(i)
Dobrze, teraz mamy fałszywą listę etykiet. Najpierw wykreśliliśmy oryginalną wersję.
plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabels,rotation=45)
plt.show()
Teraz zmodyfikowana wersja.
plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabelsnew,rotation=45)
plt.show()
 7
Author: Deninhos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-12 00:55:26
xmarks=[i for i in range(1,length+1,1)]

plt.xticks(xmarks)

To zadziałało dla mnie

Jeśli chcesz kleszcze pomiędzy [1,5] (1 i 5 włącznie) to zastąp

length = 5
 1
Author: Piyush Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-30 07:56:49

Oto czysta implementacja Pythona żądanej funkcjonalności, która obsługuje dowolne serie liczbowe (int lub float) z dodatnimi, ujemnymi lub mieszanymi wartościami:

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
    """
    import math as Math
    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)

Przykładowe Wyjście:

# 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]

I Użycie Próbki:

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()
 1
Author: Greenstick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-28 20:55:08