原則として、 reは常にplt.gca().yaxis.set_xticklabels()
でカスタムラベルを設定するオプションです。
ただし、なぜここにmatplotlib.ticker.FuncFormatter
を使用するべきではないかわかりません。 FuncFormatter
は、ティックラベルの位置と値に応じて、カスタムティックラベルを提供する目的のために設計されています。 実際にはnice exampleがmatplotlibのサンプルコレクションにあります。
この場合、望みどおりにFuncFormatterを使用して、ユニット接頭辞をmatplotlibプロットの軸に接尾辞として指定することができます。この目的のために、1000の倍数を繰り返し、フォーマットされる値がそれを超えているかどうかを確認します。値が整数の場合は、それぞれの単位記号を接尾辞として整数として整形できます。一方、小数点の後ろに余りがある場合は、この数値の書式設定に必要な小数点以下の桁数を確認します。次のプロットを提供
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
def y_fmt(y, pos):
decades = [1e9, 1e6, 1e3, 1e0, 1e-3, 1e-6, 1e-9 ]
suffix = ["G", "M", "k", "" , "m" , "u", "n" ]
if y == 0:
return str(0)
for i, d in enumerate(decades):
if np.abs(y) >=d:
val = y/float(d)
signf = len(str(val).split(".")[1])
if signf == 0:
return '{val:d} {suffix}'.format(val=int(val), suffix=suffix[i])
else:
if signf == 1:
print val, signf
if str(val).split(".")[1] == "0":
return '{val:d} {suffix}'.format(val=int(round(val)), suffix=suffix[i])
tx = "{"+"val:.{signf}f".format(signf = signf) +"} {suffix}"
return tx.format(val=val, suffix=suffix[i])
#return y
return y
fig, ax = plt.subplots(ncols=3, figsize=(10,5))
x = np.linspace(0,349,num=350)
y = np.sinc((x-66.)/10.3)**2*1.5e6+np.sinc((x-164.)/8.7)**2*660000.+np.random.rand(len(x))*76000.
width = 1
ax[0].bar(x, y, width, align='center', linewidth=2, color='red', edgecolor='red')
ax[0].yaxis.set_major_formatter(FuncFormatter(y_fmt))
ax[1].bar(x[::-1], y*(-0.8e-9), width, align='center', linewidth=2, color='orange', edgecolor='orange')
ax[1].yaxis.set_major_formatter(FuncFormatter(y_fmt))
ax[2].fill_between(x, np.sin(x/100.)*1.7+100010, np.cos(x/100.)*1.7+100010, linewidth=2, color='#a80975', edgecolor='#a80975')
ax[2].yaxis.set_major_formatter(FuncFormatter(y_fmt))
for axes in ax:
axes.set_title("TTL Distribution")
axes.set_xlabel('TTL Value')
axes.set_ylabel('Number of Packets')
axes.set_xlim([x[0], x[-1]+1])
plt.show()
:あなたの答えのための
いい例、たくさんのより完全な私の。しかし、 "小数点の後ろに余りがある場合は、小数点以下の桁数を確認する" *と書いていますが、カットオフはやはりランダムです。例えば。 'y_fmt(100100、0)'は '100.1k'を返しますが、' y_fmt(100010,0) 'は' 100k'を返します。 – Bart
@Bart正解!私はその問題を考えましたが、その後それを忘れました。私はこの例を更新しました。その場合、数字は大きくても近くにあります。 – ImportanceOfBeingErnest
組み込みの 'EngFormatter'もあります。これは、非常に似たようなものです。http://matplotlib.org/examples/api/engineering_formatter.html – tacaswell