y軸をパーセントでフォーマット


114

次のようなパンダで作成された既存のプロットがあります:

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

y軸の形式は浮動小数点で、y軸をパーセンテージに変更したいと思います。私が見つけたすべてのソリューションはax.xyz構文を使用しており、プロットを作成するコードを上の行の下にのみ配置できます(上の行にax = axを追加することはできません)。

上記の行を変更せずにy軸をパーセンテージとしてフォーマットするにはどうすればよいですか?

これが私が見つけ解決策ですが、プロットを再定義する必要があります

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

上記のソリューションへのリンク:Pyplot:x軸でのパーセンテージの使用


matplotlibにネイティブに実装されているアプローチに対する承認済みの回答を変更していただけませんか?stackoverflow.com/a/36319915/1840471
Max Ghenis

回答:


128

これは数か月遅れですが、新しいクラスを追加するために、matplotlibでPR#6251を作成しましたPercentFormatter。このクラスを使用すると、軸を再フォーマットするのに必要な行は1つだけです(のインポートを数える場合は2行matplotlib.ticker):

import ...
import matplotlib.ticker as mtick

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

PercentFormatter()3つの引数を受け入れ、xmaxdecimalssymbolxmax軸の100%に対応する値を設定できます。これは、0.0から1.0までのデータがあり、0%から100%まで表示したい場合に便利です。ただしてくださいPercentFormatter(1.0)

他の2つのパラメーターを使用すると、小数点と記号の後の桁数を設定できます。彼らはをデフォルトNone'%'それぞれ。decimals=None表示している軸の数に基づいて小数点の数を自動的に設定します。

更新

PercentFormatter バージョン2.1.0で適切なMatplotlibに導入されました。


@MateenUlhaq編集に大幅なコード変更を導入しないでください。あなたは私の答えのコードを何の必要もなく複製しました。それは良い編集ではありませんでした。
マッド物理学者

私の悪い、いくつかの奇妙な理由のために、私はそれを読みfrom matplotlib.ticker import mtickmtick「モジュール」が削除されたと想定しました。
Mateen Ulhaq

124

pandas dataframe plotはaxあなたに代わってを返します、そしてあなたはあなたが望むものなら何でも軸を操作し始めることができます。

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

ここに画像の説明を入力してください


5
グラフをインタラクティブにパン/ズームするとすぐに、これは望ましくない効果をもたらします
hitzg

3
matplotlib.ticker関数フォーマッタを使用するよりも数百万倍も簡単です。
ジャラッド

次に、y軸を(0,100%)に制限するにはどうすればよいですか?ax.set_ylim(0,100)を試しましたが、うまくいかないようです!!
2018年

@mpour yticksのラベルのみが変更されるため、制限は依然として自然単位です。ax.set_ylim(0、1)を設定するとうまくいきます。
Joeran

79

Jianxunのソリューションは私のために仕事をしましたが、ウィンドウの左下にあるy値インジケーターを壊しました。

私はFuncFormatter代わりに使用することになりました(また、ここで提案されているように、不要な末尾のゼロを取り除きました):

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

一般的に言えばFuncFormatter、ラベルの書式設定に使用することをお勧めします。信頼性が高く、用途が広いです。

ここに画像の説明を入力してください


18
コードをさらに簡略化できますax.yaxis.set_major_formatter(FuncFormatter('{0:.0%}'.format))。別名ラムダは必要ありません。フォーマットで作業してください。
Daniel Himmelstein

@DanielHimmelsteinこれを少し説明できますか?特に{}の内部。私の0.06がpython形式で6%にどのように変換されるのかわかりません。また、素晴らしいソリューションです。.set_ticklabelsを使用するよりもはるかに確実に機能しているようです
DChaps

3
@DChaps '{0:.0%}'.formatフォーマット関数を作成します0コロンの前のコロンは、中括弧とその内容を関数に渡された最初の引数で置き換えるようフォーマッタに指示します。コロンの後の部分.0%は、フォーマッタに値のレンダリング方法を指示します。は.0小数点以下0桁を%指定し、レンダリングをパーセントで指定します。
Daniel Himmelstein

31

簡単なワンライナーを探している人のために:

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

または、Latexを軸のテキストフォーマッタとして使用している場合は、バックスラッシュ「\」を1つ追加する必要があります。

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

私にとって、Daniel Himmelsteinの答えはうまくいきましたが、この答えはスケールを変えました
R. Cox

2

私は別の方法を提案します seaborn

作業コード:

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)

ここに画像の説明を入力してください


0

私はゲームに遅れましたが、私はこれに気づきました。Axesを使用せず、サブプロットだけを使用axplt.gca()ている人のために置き換えることができます。

@Mad Physicistの答えをエコーし​​、パッケージを使用PercentFormatterすると次のようになります:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.