2014-10-10 16 views
7

Mam wykres liniowy oparty na prostej liście liczb. Domyślnie oś X jest po prostu przyrostem o 1 dla każdej narysowanej wartości. Chciałbym być procentem zamiast tego, ale nie wiem, jak to zrobić. Więc zamiast osi X od 0 do 5, to iść od 0% do 100% (ale utrzymanie rozsądnie rozmieszczonych znaków podziałki. Kod poniżej. Dzięki!Pyplot: użycie procentu na osi X

from matplotlib import pyplot as plt 
from mpl_toolkits.axes_grid.axislines import Subplot 

data=[8,12,15,17,18,18.5] 
fig=plt.figure(1,(7,4)) 
ax=Subplot(fig,111) 
fig.add_subplot(ax) 
plt.plot(data) 

Odpowiedz

18

Poniższy kod daje uproszczony oś X, która jest oparta na procentach, zakłada, że ​​każda z twoich wartości zawiera spacje równe od 0% do 100%.

Tworzy tablicę perc, która zawiera równomiernie rozłożone wartości procentowe, które można wykorzystać do wykreślenia. dostosowuje formatowanie dla osi X, tak aby zawierał znak procentowy z użyciem matplotlib.ticker.FormatStrFormatter. Niestety wykorzystuje to formatowanie ciągów w starym stylu, w przeciwieństwie do nowego stylu, można znaleźć dokumenty w starym stylu here.

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

data = [8,12,15,17,18,18.5] 
perc = np.linspace(0,100,len(data)) 

fig = plt.figure(1, (7,4)) 
ax = fig.add_subplot(1,1,1) 

ax.plot(perc, data) 

fmt = '%.0f%%' # Format you want the ticks, e.g. '40%' 
xticks = mtick.FormatStrFormatter(fmt) 
ax.xaxis.set_major_formatter(xticks) 

plt.show() 

Example plot

+0

Nic złego w starym stylu formatowania. Nadal jest bardziej interoperacyjny z dwóch (patrz moduł logowania na przykład). –

+0

Jaki format by rzeczy miały, gdyby oryginalne wartości były już jak 0,5? Chcę zrobić to w 50%. –

+1

Innym możliwym rozwiązaniem byłoby użycie 'mtick.FuncFormatter (" {:. 0%} ".)), Który używa nowych ciągów formatowania, które uważam za bardziej czytelne i elastyczne. –

2

Jest kilka miesięcy późno, ale stworzyli PR#6251 z matplotlib, aby dodać nową PercentFormatter klasę. Z tej klasy można to zrobić w następujący sposób ustawić oś:

import matplotlib.ticker as mtick 

# Actual plotting code omitted 

ax.xaxis.set_major_formatter(mtick.PercentFormatter(5.0)) 

Spowoduje to wyświetlenie wartości od 0 do 5 w skali od 0% do 100%. Formater jest podobny w koncepcji do tego, co sugeruje program @Ffisegydd, z tym wyjątkiem, że może uwzględniać dowolne dowolne istniejące tiki.

PercentFormatter() przyjmuje trzy argumenty: max, decimals i symbol. max pozwala ustawić wartość, która odpowiada 100% na osi (w twoim przykładzie, 5).

Pozostałe dwa parametry umożliwiają ustawienie liczby cyfr po przecinku dziesiętnym i symbolu. Domyślnie są to odpowiednio None i '%'. decimals=None automatycznie ustawi liczbę punktów dziesiętnych na podstawie ilości wyświetlanych osi.

Zauważ, że ten formatator użyje wszystkich znaków, które normalnie byłyby generowane, gdybyś tylko narysował swoje dane. Nie modyfikuje niczego poza ciągami, które są wyprowadzane na znaczniki.

Powiązane problemy