Y eksenini yüzde olarak biçimlendir


114

Pandalarla oluşturulmuş mevcut bir komplo var:

df['myvar'].plot(kind='bar')

Y ekseni float biçimindedir ve y eksenini yüzdelere dönüştürmek istiyorum. Bulduğum tüm çözümler ax.xyz sözdizimini kullanıyor ve kodu yalnızca arsa oluşturan yukarıdaki satırın altına yerleştirebilirim (yukarıdaki satıra ax = ax ekleyemiyorum.)

Yukarıdaki satırı değiştirmeden y eksenini yüzde olarak nasıl biçimlendirebilirim?

İşte bulduğum çözüm ama arsayı yeniden tanımlamamı gerektiriyor :

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()

Yukarıdaki çözüme bağlantı: Pyplot: x ekseninde yüzde kullanarak


Lütfen matplotlib'de yerel olarak uygulanan yaklaşıma verdiğiniz yanıtı değiştirebilir misiniz? stackoverflow.com/a/36319915/1840471
Max Ghenis

Yanıtlar:


129

Bu birkaç ay gecikti, ancak yeni bir sınıf eklemek için matplotlib ile PR # 6251'i oluşturdum PercentFormatter. Bu sınıfla, ekseninizi yeniden biçimlendirmek için yalnızca bir satıra ihtiyacınız vardır (içe aktarmayı sayarsanız iki satır matplotlib.ticker):

import ...
import matplotlib.ticker as mtick

ax = df['myvar'].plot(kind='bar')
ax.yaxis.set_major_formatter(mtick.PercentFormatter())

PercentFormatter()Üç argüman kabul eder, xmax, decimals, symbol. xmaxeksende% 100'e karşılık gelen değeri ayarlamanıza olanak verir. Eğer 0,0 ile 1,0 arasında bir veriniz varsa ve% 0 ile% 100 arasında görüntülemek istiyorsanız bu güzeldir. Sadece yap PercentFormatter(1.0).

Diğer iki parametre, ondalık nokta ve sembolden sonraki basamak sayısını ayarlamanıza izin verir. Sırasıyla Noneve varsayılan değerlerdir '%'. decimals=Nonegösterdiğiniz eksenlere bağlı olarak ondalık nokta sayısını otomatik olarak ayarlayacaktır.

Güncelleme

PercentFormatter Matplotlib'e 2.1.0 sürümünde tanıtıldı.


@MateenUlhaq Lütfen düzenlemelerinize önemli kod değişiklikleri eklemeyin. Cevabımdaki kodu ihtiyaç duymadan kopyaladınız. İyi bir düzenleme değildi.
Mad fizikçi

Benim hatam, tuhaf bir nedenden ötürü, bunu "modül" from matplotlib.ticker import mtickün mtickkaldırıldığını düşünerek okudum .
Mateen Ulhaq

125

Pandaların veri çerçevesi grafiği axsizin için geri dönecektir , Ve sonra eksenleri istediğiniz gibi değiştirmeye başlayabilirsiniz.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(100,5))

# you get ax from here
ax = df.plot()
type(ax)  # matplotlib.axes._subplots.AxesSubplot

# manipulate
vals = ax.get_yticks()
ax.set_yticklabels(['{:,.2%}'.format(x) for x in vals])

görüntü açıklamasını buraya girin


5
Grafiği etkileşimli olarak
kaydırdığınızda

3
matplotlib.tickerİşlev biçimlendiricileri kullanmaya çalışmaktan milyon kez daha kolay !
Jarad

O zaman y eksenini (% 0,100) demek için nasıl sınırlarsınız? Ax.set_ylim (0,100) denedim ama bu işe yaramıyor!
2018

@mpour yalnızca yticklerin etiketleri değiştirilir, bu nedenle sınırlar hala doğal birimlerdedir. Ax.set_ylim (0, 1) 'i ayarlamak işe yarayacaktır.
Joeran

79

Jianxun çözümü işi benim için yaptı ama pencerenin sol alt kısmındaki y değeri göstergesini kırdı.

Bunun FuncFormatteryerine kullanmayı bıraktım (ve burada önerildiği gibi gereksiz sondaki sıfırları da sildim ):

import pandas as pd
import numpy as np
from matplotlib.ticker import FuncFormatter

df = pd.DataFrame(np.random.randn(100,5))

ax = df.plot()
ax.yaxis.set_major_formatter(FuncFormatter(lambda y, _: '{:.0%}'.format(y))) 

Genel olarak FuncFormatter, etiket biçimlendirmesi için kullanmanızı öneririm : güvenilir ve çok yönlüdür.

görüntü açıklamasını buraya girin


19
Hatta daha fazla kod kolaylaştırabilirsiniz: ax.yaxis.set_major_formatter(FuncFormatter('{0:.0%}'.format)). AKA lambdaya gerek yok, işi format yapsın.
Daniel Himmelstein

@DanielHimmelstein bunu biraz açıklar mısınız? Özellikle {} içinde. Python formatında 0.06'mın bunu kullanarak nasıl% 6'ya dönüştüğünden emin değilim. Ayrıca harika bir çözüm. .Set_ticklabels kullanmaktan çok daha güvenilir çalışıyor gibi görünüyor
DCbelki

3
@DC Belki '{0:.0%}'.formatbir biçimlendirme işlevi oluşturur . İki 0nokta üst üste işareti, biçimlendiriciye küme parantezlerini ve içeriklerini işleve iletilen ilk bağımsız değişkenle değiştirmesini söyler. İki noktadan sonraki kısım .0%, biçimlendiriciye değeri nasıl oluşturacağını söyler. , .00 ondalık basamağı %belirtir ve işlemeyi yüzde olarak belirtir.
Daniel Himmelstein

31

Hızlı tek astar arayanlar için:

plt.gca().set_yticklabels(['{:.0f}%'.format(x*100) for x in plt.gca().get_yticks()]) 

Veya eksen metin biçimlendiricisi olarak Lateks kullanıyorsanız , bir ters eğik çizgi eklemeniz gerekir '\'

plt.gca().set_yticklabels(['{:.0f}\%'.format(x*100) for x in plt.gca().get_yticks()]) 

Benim için, Daniel Himmelstein cevabı bu yanıt ölçeği değişti oysa çalıştı
R. Cox

2

Kullanarak alternatif bir yöntem öneriyorum seaborn

Çalışma kodu:

import pandas as pd
import seaborn as sns
data=np.random.rand(10,2)*100
df = pd.DataFrame(data, columns=['A', 'B'])
ax= sns.lineplot(data=df, markers= True)
ax.set(xlabel='xlabel', ylabel='ylabel', title='title')
#changing ylables ticks
y_value=['{:,.2f}'.format(x) + '%' for x in ax.get_yticks()]
ax.set_yticklabels(y_value)

görüntü açıklamasını buraya girin


0

Oyuna geç kaldım ama bunun farkına vardım: axile değiştirilebilirplt.gca() eksenleri ve sadece subplots kullanmayan kişiler için.

@Mad Physicist cevabını tekrarlamak, paketi kullanarak PercentFormatterşöyle olurdu:

import matplotlib.ticker as mtick

plt.gca().yaxis.set_major_formatter(mtick.PercentFormatter(1))
#if you already have ticks in the 0 to 1 range. Otherwise see their answer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.