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.