Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

matplotlib グラフの設定

matplotlibのグラフの設定について
 

日本語の表示

日本語を表示する場合は、表示するごとにfontproperties = fpをセットする。

from matplotlib.font_manager import FontProperties
fp = FontProperties(fname='C:\WINDOWS\Fonts\msgothic.ttc', size=14)

plt.title("折れ線グラフ", fontproperties=fp)

 

グラフのタイトル

 plt.title(str, loc='center')
・表示位置

loc='center' 中央。デフォルト
loc='left' 左寄せ
loc='right' 右寄せ

 

表示範囲(変域)

・両軸の表示範囲の取得
 xmin, xmax, ymin, ymax = plt.axis()
 
・両軸の表示範囲の設定
 plt.axis(xmin, xmax, ymin, ymax)
 
・軸ごとに範囲を設定

plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.xlim(xmax=10)     # xminは変えずに、xmaxだけ変更
plt.xlim(xmin=0)      # xmaxは変えずに、ximnだけ変更

 

 ax = plt.gca() # get current axis
 ax.xaxis.set_ticks_position("bottom") # 目盛りは軸の下
 
・枠と目盛りを消去
 plt.axis("off")
 

目盛り

・現在の横軸の位置配列、ラベル配列の取得
 xlocs, xlabels = plt.xticks()
・現在の縦軸の位置配列、ラベル配列の取得
 ylocs, ylabels = plt.yticks()
 
・目盛りの配分

plt.xticks(-4, 4, 9)   # -4から4まで9個(8等分)
plt.sticks([-1, 0, 1]) # -1, 0, 1の3つ

 
・目盛りの配分とラベルを同時に設定
 plt.xticks(xlocs, xlabels, color, rotation) # xlocs:位置の配列 xlabels:ラベルの配列
 

グラフの枠線

・枠線を消す

ax = plt.gca() # get current axis
ax.spines["right"].set_color("none")  # 右消し
ax.spines["left"].set_color("none")   # 左消し
ax.spines["top"].set_color("none")    # 上消し
ax.spines["bottom"].set_color("none") # 下消し

 
・枠線の色を変える
 上記でset_color("blue")など

凡例

plt.plot(x, y, color=~, label="y=sin(x)") # 凡例の設定
plt.legend(loc="upper_left")               # 凡例の表示

 

グリッドを表示する

 plt.grid(color='gray')
 

水平線、垂直線、直線

水平線をまとめて引く
 plt.hlines(seq, xmin, xmax, colors="k", linestyle="solid", label="")
 
・垂直線をまとめて引く
 plt.vlines(seq, ymin, ymax, colors="k", linestyle="solid", label="")
 
・直線を1本引く
 plt.plot({x1, x2], [y1, y2])
 
・折れ線を引く
 plt.plot(seqx, seqy)

・グラフの大きさ
 inchで指定
 plt.figure(figsize=(width,height), dpi=80)
 
・サブプロットに分ける

# グラフエリアを縦2、横3に分割してその1番目
plt.subplot(2, 3, 1)
plt.plot(x, y1)        # そのサブエリアに描画

# グラフエリアを縦2、横3に分割してfig配列、ax配列に格納
fig, ax = plt.subplots(2, 3)
ax[0, 0].plot(x, y)    # その0行0列目のサブエリアにプロット

# サブエリアの大きさの比率を変える
from matplotlib import gridspec
gs = gridspec.GridSpec(2, 2, width_ratios=(6, 1), height_ratios=(4, 1))
plt.subplot(gs[0, 0]).plot(x, y) # 0行0列目にプロット

・グラフの塗りつぶし
 plt.fill(x, y, color)
 

キーワードいろいろ

・線種linestyle, ls

solid - 実線
dashed -- 破線
dashdot -. 破点線
dotted : 点線
(offset, on-off-dash-seq)    

・線の幅 linewidth, lw
 floatで単位はpoint
 

サンプル

サンプル1

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties
fp = FontProperties(fname='C:\WINDOWS\Fonts\msgothic.ttc', size=14)

x = np.linspace(-np.pi, np.pi*1.1, 100)
plt.plot(x, np.cos(x), "r", label="y=cos(x)")
plt.plot(x, np.sin(x), "olive", label="y=sin(x)")
plt.title("三角関数", loc="center", fontproperties=fp)

plt.xlim(xmin=-np.pi)
plt.ylim(-1.1, 1.1)
xtick = np.array(["-π", "-1/2π", "0", "1/2π", "π"])
locs = np.linspace(-np.pi, np.pi, 5)
plt.xticks(locs, xtick, color="c", fontsize=14, rotation=30)
plt.yticks([-1, 0, 1])

ax = plt.gca()                        # get current axis
ax.spines["right"].set_color("none")  # 右枠消し
ax.spines["top"].set_color("none")    # 上枠消し
ax.spines["left"].set_color("m")      # 左枠をマゼンダに
ax.spines["bottom"].set_color("c")    # 下枠をシアンに
         
plt.vlines(np.linspace(-np.pi, np.pi, 5),
           -1.1, 1.1, "c",linestyle=":", lw=1)
plt.hlines([0], -np.pi, np.pi*1.1, "m", linestyle=":", lw=1)

plt.legend()    # 凡例の表示
plt.show()

f:id:rare_Remrin:20170527105105p:plain
 
サンプル2

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties
fp = FontProperties(fname='C:\WINDOWS\Fonts\msgothic.ttc', size=14)
from matplotlib import gridspec

x = np.random.randn(1000)
y = np.random.randn(1000)

gs = gridspec.GridSpec(2, 2, width_ratios=(6, 1), height_ratios=(4, 1))
ax = [plt.subplot(gs[0, 0]), plt.subplot(gs[0, 1]), plt.subplot(gs[1, 0])]

# メインの散布図
ax[0].set_title("散布図", fontproperties=fp)
ax[0].scatter(x, y, c="c", alpha=0.5) # 不透明度0.5
ax[0].grid()                          # グリッド表示

# 右側のヒストグラム
ax[1].hist(y, 50, orientation="horizontal")
ax[1].invert_xaxis()       # 左右反転
ax[1].yaxis.tick_right()   # 縦軸の目盛りを右側に配置

# 下のヒストグラム
ax[2].hist(x, 100)
ax[2].tick_params(labelbottom="off")

plt.tight_layout()
plt.show()

f:id:rare_Remrin:20170527105118p:plain
 
サンプル3

import matplotlib.pyplot as plt
import numpy as np

# 3x3の9個のサブプロットに分割
fig, axs = plt.subplots(3, 3, figsize=(8, 6))

t = np.linspace(0, np.pi*2, 100)
for i in range(3):
    for j in range(3):
        axs[i, j].plot(np.cos(t*(i+1)), np.sin(t*(j+1)))

f:id:rare_Remrin:20170527114609p:plain
 
サンプル4

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-2, 2, 100)

# 2x3の6個のサブプロットに分割
for i in range(5):
    plt.subplot(2, 3, i+1)
    plt.plot(x, x**i)
    plt.title("y=x^{}".format(i))
plt.tight_layout()
plt.show()

f:id:rare_Remrin:20170527114600p:plain