デフォルトのmatplotlibグラフは、見た目が悪く、専門的でもないように見えます。私はseabornとprettyplotlibを含むいくつかのパッケージを試しましたが、どちらもスタイルをほとんど改善していません。
これまでのところ、seabornパッケージを使用して次のようになっています。
以下は私が探している外見ですが、上からはほど遠いです:
2番目の例の次の良さに注意してください。
私の質問は次のとおりです。あなたは上記をmatplotlibですぐに使用できるある種の人気のあるテーマまたはスタイルとして認識していますか?または、いくつかのパッケージから使用できる場合はどうなりますか?それが失敗した場合、とにかくこのスタイルを私のグローバルな好みとして設定することはありますか?それが失敗した場合、これをmatlibplotで行うことも可能ですか?
ありがとう!
これは本当に好みの問題であり、対象読者の問題でもあります。 matplotlib
は、科学的な目的のために明確なイラストを作成しようとします。これは-必然的に-妥協であり、イラストは雑誌に印刷したり、広告に表示したりするものではありません。
この意味で、matplotlib
には良いニュースと悪いニュースがあります。
悪いニュース:
matplotlib
で美しいプロットを作成する魔法のコマンドやパッケージはありません。朗報:
私の意見では、最も難しいことはあなたが欲しいものを決めることです。初めは急な学習曲線がありますが、それからあなたが望むことをすることはより簡単です。
例として:
import numpy as np
import matplotlib.pyplot as plt
# create some fictive access data by hour
xdata = np.arange(25)
ydata = np.random.randint(10, 20, 25)
ydata[24] = ydata[0]
# let us make a simple graph
fig = plt.figure(figsize=[7,5])
ax = plt.subplot(111)
l = ax.fill_between(xdata, ydata)
# set the basic properties
ax.set_xlabel('Time of posting (US EST)')
ax.set_ylabel('Percentage of Frontpaged Submissions')
ax.set_title('Likelihood of Reaching the Frontpage')
# set the limits
ax.set_xlim(0, 24)
ax.set_ylim(6, 24)
# set the grid on
ax.grid('on')
(コメントのみ:元の画像のX軸の制限では、データの周期性は考慮されていません。)
これにより、次のようになります。
これをエンジニアリング志向の少ないオーディエンスに表示できるようにするために、多くの変更を行う必要があることを理解するのは簡単です。少なくとも:
# change the fill into a blueish color with opacity .3
l.set_facecolors([[.5,.5,.8,.3]])
# change the Edge color (bluish and transparentish) and thickness
l.set_edgecolors([[0, 0, .5, .3]])
l.set_linewidths([3])
# add more ticks
ax.set_xticks(np.arange(25))
# remove tick marks
ax.xaxis.set_tick_params(size=0)
ax.yaxis.set_tick_params(size=0)
# change the color of the top and right spines to opaque gray
ax.spines['right'].set_color((.8,.8,.8))
ax.spines['top'].set_color((.8,.8,.8))
# Tweak the axis labels
xlab = ax.xaxis.get_label()
ylab = ax.yaxis.get_label()
xlab.set_style('italic')
xlab.set_size(10)
ylab.set_style('italic')
ylab.set_size(10)
# Tweak the title
ttl = ax.title
ttl.set_weight('bold')
今私たちは持っています:
これは質問とまったく同じではありませんが、すべてをその方向に調整できます。ここで設定するものの多くは、matplotlib
のデフォルトとして設定できます。多分これはプロットの物事を変更する方法のアイデアを与えます。
好みのスタイルに近づけるには、seabornでwhitegrid
スタイルを使用できます。他の回答で述べたように、alpha
パラメータをfill_between
に使用して、塗りの透明度を制御します。
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style("whitegrid")
blue, = sns.color_palette("muted", 1)
x = np.arange(23)
y = np.random.randint(8, 20, 23)
fig, ax = plt.subplots()
ax.plot(x, y, color=blue, lw=3)
ax.fill_between(x, 0, y, alpha=.3)
ax.set(xlim=(0, len(x) - 1), ylim=(0, None), xticks=x)
シーボーンスタイルの詳細については、 docs を参照してください。
matplotlib
はほぼ無限の柔軟性を備えているため、ほとんど何でも実行でき、存在しない場合は自分で作成できます。明らかにデフォルトは当たり障りのないものです。これは、誰もが「ナイス」とは何かについて独自の考えを持っているため、事前定義されたスタイルを課すことは無意味だからです。
これは、4つのポイントに対処する非常に単純な例です。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
x = np.linspace(-10, 10, 1000)
y = 1+np.sinc(x)
ax = plt.subplot(111)
ax.plot(x, y, lw=2)
ax.fill_between(x, 0, y, alpha=0.2)
ax.grid()
majorLocator = MultipleLocator(1)
ax.xaxis.set_major_locator(majorLocator)
plt.show()
すべてのプロットが同じように見えるようにデフォルトを設定する場合は、カスタムmatplotlibrc file
を生成する必要があります。便利な ガイドはこちら 。利用可能なすべてのオプションのリストを表示するには、対話型ターミナルからprint plt.rcParams
を呼び出すだけです。
塗りつぶしなどの他の機能の一部は、プロットごとに実行する必要があります。軸インスタンスやデータなどの特定の入力の間に塗りつぶしを追加する関数を作成することで、作業全体でこれを標準化できます。
次のようにプロットスタイルをカスタマイズできます。
import numpy as np
import matplotlib.pyplot as plt
plt.use_style('ggplot') # customize your plots style
x = np.linspace(0,2*np.pi,100)
y = np.sin(x)
plt.fill_between(x,y)
plt.show()