web-dev-qa-db-ja.com

matplotlibグラフをプロのように見せかけるにはどうすればよいですか?

デフォルトのmatplotlibグラフは、見た目が悪く、専門的でもないように見えます。私はseabornとprettyplotlibを含むいくつかのパッケージを試しましたが、どちらもスタイルをほとんど改善していません。

これまでのところ、seabornパッケージを使用して次のようになっています。

enter image description here

以下は私が探している外見ですが、上からはほど遠いです:

enter image description here

2番目の例の次の良さに注意してください。

  1. グラフの下の領域は、はるかに目を楽しめる色で満たされます。
  2. グラフの線は思慮深く、見事に際立っています。
  3. 軸線は思想的であり、再びうまく目立ちます。
  4. 曲線の下の領域は透明です。
  5. X軸の目盛りはより密集しています。

私の質問は次のとおりです。あなたは上記をmatplotlibですぐに使用できるある種の人気のあるテーマまたはスタイルとして認識していますか?または、いくつかのパッケージから使用できる場合はどうなりますか?それが失敗した場合、とにかくこのスタイルを私のグローバルな好みとして設定することはありますか?それが失敗した場合、これをmatlibplotで行うことも可能ですか?

ありがとう!

14
Shital Shah

これは本当に好みの問題であり、対象読者の問題でもあります。 matplotlibは、科学的な目的のために明確なイラストを作成しようとします。これは-必然的に-妥協であり、イラストは雑誌に印刷したり、広告に表示したりするものではありません。

この意味で、matplotlibには良いニュースと悪いニュースがあります。

悪いニュース:

  • matplotlibで美しいプロットを作成する魔法のコマンドやパッケージはありません。

朗報:

  • デフォルト設定を変更する簡単な方法があります。以下を参照してください http://matplotlib.org/users/customizing.html
  • オブジェクトモデルにより、ユーザーはほぼすべてを変更し、複雑な新機能を導入できます。
  • ソースコードが利用可能であり、ユーザーがそれを非常に簡単に変更することもできます。

私の意見では、最も難しいことはあなたが欲しいものを決めることです。初めは急な学習曲線がありますが、それからあなたが望むことをすることはより簡単です。

例として:

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軸の制限では、データの周期性は考慮されていません。)

これにより、次のようになります。

enter image description here

これをエンジニアリング志向の少ないオーディエンスに表示できるようにするために、多くの変更を行う必要があることを理解するのは簡単です。少なくとも:

  • 塗りつぶしを透明にし、色の不快感を少なくする
  • 線を太くする
  • 線の色を変更する
  • 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')

今私たちは持っています:

enter image description here

これは質問とまったく同じではありませんが、すべてをその方向に調整できます。ここで設定するものの多くは、matplotlibのデフォルトとして設定できます。多分これはプロットの物事を変更する方法のアイデアを与えます。

18
DrV

好みのスタイルに近づけるには、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)

enter image description here

シーボーンスタイルの詳細については、 docs を参照してください。

7
mwaskom

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

enter image description here

すべてのプロットが同じように見えるようにデフォルトを設定する場合は、カスタムmatplotlibrc fileを生成する必要があります。便利な ガイドはこちら 。利用可能なすべてのオプションのリストを表示するには、対話型ターミナルからprint plt.rcParamsを呼び出すだけです。

塗りつぶしなどの他の機能の一部は、プロットごとに実行する必要があります。軸インスタンスやデータなどの特定の入力の間に塗りつぶしを追加する関数を作成することで、作業全体でこれを標準化できます。

3
Greg

次のようにプロットスタイルをカスタマイズできます。

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