一日一Python:色々なグラフの描き方

一日一Python:色々なグラフの描き方

はじめに

昔書いたものを投稿.記事中のリンクはダミーが多い.

一向に解析が終わらないので,色々なグラフをみていこう.グラフって最も基本でありながら,ある意味で一番詰まる部分でもあったりするので,これまでに触ってきたグラフをここで纏めてみたい.後で検索して調べやすい様に,出来るだけ説明的に,キーワードを散りばめておきたい.

まず,グラフを描くライブラリとしては,

  • matplotlib
  • seaborn
  • pandas
  • plotly

等がある.matplotlibは言わずもがな,ド定番のライブラリで,MATLABから移植されたモジュールで,使い勝手も似たような感じ.自由度は極めて高く,使いこなせればなんでもできるが(絵を描いたり,アニメを表示する事もできる),一から十まで指定しなければいけないので,使いこなすのが大変だったりする.

seabornやpandasはmatplotlibのラッパーになっており,それぞれ明確な意図の元で,モジュール化されている.seabornは「Seaborn: statistical data visualization」と謳っている通り,設計思想に統計学が透けてみえる.主に統計的データのビジュアライゼーションや,統計解析の支援に有用だろう.また,学術的立場から見易さが追求され,分り易く,出来る限りシンプルで,合理的なシンプルさを備え持つ.「import seaborn」をするだけで,スタイルがセットされるので,おまじないのごとく,とりあえずmatplotlibとセットにしておくと良いだろう.

pandasは「Panel Data System」の略であり,「easy-to-use data structures and data analysis tools

」と説明されている.パネルデータとは,統計学や計量経済学等でよく使われる用語で,時系列データとクロスセクションデータを合わせ,時間的,空間的な分析を目的にしたデータの事で,それを分析/解析する為のツールを謳っているのがPandasである.従って,その手のデータ解析に於いて,Pandasを使わないのはあり得ない!というのがよく分かるだろう.データの分析手法として,グラフ化は簡便でありながら強力な手法である事は言うまでもない.Pandasにもグラフ化の為の方法が幾つも備わっており,Pandasで扱えるデータ(DataFrameやSeries)の場合は,Pandas.plotを使わない手は無いだろう.内部処理的には,matplotlibを呼び出しているため,自分で実装できる筈だが,込み入ったデータ等は自分でなかなか軸を揃えたり,上手く意図したグラフを描画できなかったりするが,そんなデータでも綺麗にグラフ化してくれる.本当にすごいやつだ.

plotlyはインタラクティブなグラフ描画を可能にするライブラリで,マウスでグリグリと動かせるグラフを簡単に作成できる.しかし,単純に拡大/縮小や軸に合わせて移動したいだけなら,Jupyterのインタラクティブモードを起動すれば十分だったりする(%matplotlib nbagg).なので,ここではほとんど説明しない.

それでは,一つずつみていこう.

PAGE_BREAK: PageBreak

10分で学ぶPython 第4回 Seabornでグラフ描画

より

import numpy as np  #数値計算用パッケージ,これがあると本当に便利
import pandas as pd #データ解析,分析用パッケージ(Numpyベース)
import seaborn as sns #“グラフ描画,ビジュアライゼーション用パッケージ


x = np.random.normal(size=1000) #ランダムデータをnumpy arrayとして作る

tips = sns.load_dataset("tips")  ## お店の食事時間と会計総額とチップの関係のデータ
iris = sns.load_dataset("iris")  ## Rでお馴染みのアヤメの統計データ
sns.distplot(x, kde=True, rug=True, bins=10) ##ヒストグラム

null

sns.jointplot('sepal_width', 'petal_length', data=iris) ##散布図

null

sns.pairplot(iris, hue="species") ##全ての変数同士の散布図がみられる, "hue="オプションでカテゴリ別に色分け可能

null

PAGE_BREAK: PageBreak

10分で学ぶPython番外編 Pandasモジュールについて-10分では学べ無いけど重要-

より

Pandas.DataFrame.plot()

null

PAGE_BREAK: PageBreak

#棒グラフ(各列平均の棒グラフ), Pandas.DataFrame.mean().plot.bar()も可能
Pandas.DataFrame.mean().plot(kind='bar')

null

PAGE_BREAK: PageBreak

#散布図, Pandas.DataFrame.plot.scatter('sepal_length', 'sepal_width')
Pandas.DataFrame.plot('sepal_length', 'sepal_width', kind='scatter')

null

PAGE_BREAK: PageBreak

#ヒストグラム
Pandas.DataFrame.hist()

null

#ヒストグラム
Pandas.DataFrame.plot(kind='hist')

null

PAGE_BREAK: PageBreak

#散布図行列(全列間の散布図)「from pandas.tools.plotting import scatter_matrix」
scatter_matrix(Pandas.DataFrame)

null

内部処理的にplt.subplot()とplt.scatter(), plt.hist()の嵐っぽい.

カテゴリーデータに基づいて色分けしたければ,seabornを使った方が良い.

PAGE_BREAK: PageBreak

#seabornの散布図行列
sns.pairplot(d, hue='species')#import seaborn as sns

null

PAGE_BREAK: PageBreak

#各列の棒グラフ(sepal_lengthでソート)
DataFrame.sort_values('sepal_length').plot.barh(subplots=True, layout=(1,4), sharex=False, legend=False, figsize=(12, 6))
#subplots=Trueで各列別々のグラフ,layout=(1, 4)で横に4つのグラフ
#sharex=Falseで各列ごとに軸変更可,legend=Falseで凡例なし,figsizeで大きさ指定

null

PAGE_BREAK: PageBreak

一日一Python(1コード):前回の続き-Opening処理をしてノイズ除去&エッジ検出して欲しい所をトリミング

より

#Jupyter上で画像表示する場合はmatplotlibを使う方が良い
f, axarr = plt.subplots(4, sharex=True, sharey=True)
axarr[0].imshow(im_org)#元画像
axarr[0].set_title('Origin image and mask')
axarr[1].imshow(hsv)
axarr[2].imshow(im_mdn)
axarr[3].imshow(mask)#mask画像

null

2次元(イメージ)データの描画にはimshow()を使う.ヒートマップなども同様.

PAGE_BREAK: PageBreak

一日一Python(1コード):QiitaやStackoverflowをみていて適当に思いついた事をやる

より

import sympy as sym
sym.init_printing()
F = x**3 - 2 * x + y**2 > 0#楕円曲線
sym.plot_implicit(F, (x, -2, 2), (y, -2, 2))

null

F = x**3 - 2 * x + y**2
sym.plot_implicit(F, (x, -2, 2), (y, -2, 2))

null

PAGE_BREAK: PageBreak

F = x**2 + y**2 - 4
sym.plot_implicit(F, (x, -2, 2), (y, -2, 2))

null

from sympy.plotting import plot

F = 2 * x ** 2 - 3 * x + 1
plot(F, (x, -1, 2))

null

PAGE_BREAK: PageBreak

import sympy as sym
import numpy as np
from scipy import integrate
import matplotlib.pyplot as plt
import seaborn as sns
sym.init_printing() #最適化処理、無くても良い

# 使用する変数の定義
x = sym.symbols('x')

F = x + 1
G = x**2 - 1

#陽関数の場合は,sympy.plotting.plot()
#陰関数の場合は,sympy.plot_implicit()

sym.plotting.plot(F, G, (x, -1, 3))

null

陽関数の場合は,sympy.plotting.plot()

陰関数の場合は,sympy.plot_implicit()

を使うといいだろう。

PAGE_BREAK: PageBreak

Pythonでアニメーション描画

より

ーArtistAnimation

import numpy as np
import matplotlib.animation as animation
import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure()
ims = []

#initial condition
grvt_accl = 9.8
vl_init = 19.6
y_init = 0

t = np.arange(0, 4.1, 0.1)
x = np.array([0]*t.size)
accl = np.array([-grvt_accl]*t.size)#時間tに対する加速度aベクトル
vl = vl_init + accl * t
y = y_init + vl_init * t + 1/2 * accl * t**2
ax1 = fig.add_subplot(4,1,1)
ax2 = fig.add_subplot(4,1,2)
ax3 = fig.add_subplot(4,1,3)
ax4 = fig.add_subplot(4,1,4)
ax1.plot(t, accl)
ax2.plot(t, vl)
ax3.plot(t, y)
ax4.plot(x, y)

for i in range(t.size):
    im, = ax1.plot(t[i], accl[i], 'o')
    im2, = ax2.plot(t[i], vl[i], 'o')
    im3, = ax3.plot(t[i], y[i], 'o')
    im4, = ax4.plot(x[i], y[i], 'o')
    ims.append([im, im2, im3, im4])

ani = animation.ArtistAnimation(fig, ims)
ani.save('hogehoge2.gif', writer='imagemagick')
plt.show()

null

ーFuncAnimation

#FuncAnimationバージョン
#鉛直投げ上げ運動
#
#accl = -grvt_accl
#vl = vl_init + accl*t = vl0 - grvt_accl*t
#y = y_init + vl_init -1/2 * grvt_accl * t^2
#a-tグラフ,v-tグラフ,y-tグラフ,x-yグラフを描く

import numpy as np
import matplotlib.animation as animation
import matplotlib.pyplot as plt
import seaborn as sns

grvt_accl = 9.8
vl_init = 19.6
y_init = 0

t = np.arange(0, 4.1, 0.1)
x = np.array([0]*t.size)
accl = np.array([-grvt_accl]*t.size)#時間tに対する加速度aベクトル
vl = vl_init + accl * t
y = y_init + vl_init * t + 1/2 * accl * t**2

def update(i):
    plt.clf()

    plt.subplot(4, 1, 1)
    plt.plot(t, accl)
    plt.plot(t[i], accl[i], 'o')

    plt.subplot(4, 1, 2)
    plt.plot(t, vl)
    plt.plot(t[i], vl[i], 'o')

    plt.subplot(4, 1, 3)
    plt.plot(t, y)
    plt.plot(t[i], y[i], 'o')

    plt.subplot(4, 1, 4)
    plt.plot(x[i], y[i], 'o')
    plt.plot(x, y)


fig = plt.figure()
ani = animation.FuncAnimation(fig, update, frames=t.size, blit=True)
ani.save('hogeFunc.gif', writer='imagemagick', fps=5)
plt.show()

null

PAGE_BREAK: PageBreak

一日一Python(1コード):Pythonで制御工学ーボード線図を描いてみよう

より

,周波数特性を知りたい.周波数応答を知るために,ボード線図を描きたい.伝達関数求めるのに微積分は面倒だからラプラス変換がしたい.「Scipy.signal」でボード線図を求める事ができる.「Python-control」はMATLABライクなモジュールで,MATLABのcontrol toolboxでできる事の大体の事ができるっぽい.Sympyでも記号定義して,式変換の関数を利用すればラプラス変換ができるっぽい.そんな話.

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# パラメータ設定
m = 0
c = 1
k = 625

num = [k]
den = [m, c, k]
s1 = signal.lti(num, den)
w, mag, phase = signal.bode(s1, np.arange(1, 10000, 1))

# プロット
plt.figure(1)
plt.subplot(211)
plt.loglog(w, 10**(mag/20))
plt.ylabel("Amplitude")
plt.axis("tight")
plt.subplot(212)
plt.semilogx(w, phase)
plt.xlabel("Frequency[Hz]")
plt.ylabel("Phase[deg]")
plt.axis("tight")
plt.ylim(-100, 0)
# plt.show()

null

Scipy.signalには信号処理の様々な関数が用意されていて,signal.firwin()でFIRフィルタ,その他ffrwin2を用いてFIRフィルタ,IIRフィルタ,その他フィルタを簡単に設計できるし,signal.buttord(), signal.cheb1ord(), signal.bessel()等,その他パワースペクトルを求める関数とか,信号処理に関する一通りのものが揃っている

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

n = 1024
dt = 0.001
fs = 1/dt
f1 = 120
f2 = 150
t = np.linspace(1, n, n)*dt-dt
y = np.sin(2*np.pi*f1*t)+2*np.sin(2*np.pi*f2*t)+0.1*np.random.randn(t.size)

freq1, P1 = signal.periodogram(y, fs)
freq2, P2 = signal.welch(y, fs)
freq3, P3 = signal.welch(y, fs, nperseg=n/2)
freq4, P4 = signal.welch(y, fs, nperseg=n/8)

plt.figure()
plt.plot(freq1, 10*np.log10(P1), "b", label="periodogram")
plt.plot(freq2, 10*np.log10(P2), "r", linewidth=2, label="nseg=n/4")
plt.plot(freq3, 10*np.log10(P3), "c", linewidth=2, label="nseg=n/2")
plt.plot(freq4, 10*np.log10(P4), "y", linewidth=2, label="nseg=n/8")
plt.ylim(-60, 0)
plt.legend(loc="upper right")
plt.xlabel("Frequency[Hz]")
plt.ylabel("Power/frequency[dB/Hz]")
# plt.show()

null

PAGE_BREAK: PageBreak

import numpy as np
from scipy import signal
import matplotlib.pyplot as plt

# 時系列のサンプルデータ作成
n = 512                         # データ数
dt = 0.01                       # サンプリング間隔
f = 1                           # 周波数
fn = 1/(2*dt)                   # ナイキスト周波数
t = np.linspace(1, n, n)*dt-dt
y = np.sin(2*np.pi*f*t)+0.5*np.random.randn(t.size)

# パラメータ設定
fp = 2                          # 通過域端周波数[Hz]
fs = 3                          # 阻止域端周波数[Hz]
gpass = 1                       # 通過域最大損失量[dB]
gstop = 40                      # 阻止域最小減衰量[dB]
# 正規化
Wp = fp/fn
Ws = fs/fn

# ローパスフィルタで波形整形
# バターワースフィルタ
N, Wn = signal.buttord(Wp, Ws, gpass, gstop)
b1, a1 = signal.butter(N, Wn, "low")
y1 = signal.filtfilt(b1, a1, y)

# 第一種チェビシェフフィルタ
N, Wn = signal.cheb1ord(Wp, Ws, gpass, gstop)
b2, a2 = signal.cheby1(N, gpass, Wn, "low")
y2 = signal.filtfilt(b2, a2, y)

# 第二種チェビシェフフィルタ
N, Wn = signal.cheb2ord(Wp, Ws, gpass, gstop)
b3, a3 = signal.cheby2(N, gstop, Wn, "low")
y3 = signal.filtfilt(b3, a3, y)

# 楕円フィルタ
N, Wn = signal.ellipord(Wp, Ws, gpass, gstop)
b4, a4 = signal.ellip(N, gpass, gstop, Wn, "low")
y4 = signal.filtfilt(b4, a4, y)

# ベッセルフィルタ
N = 4
b5, a5 = signal.bessel(N, Ws, "low")
y5 = signal.filtfilt(b5, a5, y)

# FIR フィルタ
a6 = 1
numtaps = n
b6 = signal.firwin(numtaps, Wp, window="hann")
y6 = signal.lfilter(b6, a6, y)
delay = (numtaps-1)/2*dt

# プロット
plt.figure()
plt.plot(t, y, "b")
plt.plot(t, y1, "r", linewidth=2, label="butter")
plt.plot(t, y2, "g", linewidth=2, label="cheby1")
plt.plot(t, y3, "c", linewidth=2, label="cheby2")
plt.plot(t, y4, "m", linewidth=2, label="ellip")
plt.plot(t, y5, "k", linewidth=2, label="bessel")
plt.plot(t-delay, y6, "y", linewidth=2, label="fir")
plt.xlim(0, 4)
plt.legend(loc="upper right")
plt.xlabel("Time [s]")
plt.ylabel("Amplitude")
# plt.show()

null

PAGE_BREAK: PageBreak

一日一Python:RainbowChart2

より

Pandas.plotでサブプロットを用いたい時のテクニック

_, axarr = plt.subplots(2, figsize=(8, 6))

DATARainbow_shift.plot(ax = axarr[0])

DATARainbow_shift.tail(365).plot(ax = axarr[1])

pandas.plot(ax=……)でグラフ軸を指定できる.

plt.plotは2つの返り値があるが,返り値を使用しない場合は明示的に「_」を使う.

PAGE_BREAK: PageBreak

10分で学ぶPython 第10回 2軸グラフを描こう-Pandas plotが超便利という話

より引用

import pandas as pd
import seaborn as sns

df = pd.read_csv("Demographics.csv", index_col='TIME')#index_col=0でも良い

df_diff = df.diff()
df_diff.columns = ['City001_diff', 'City002_diff', 'City003_diff']

dfdf = df.join(df_diff)

ax = dfdf.plot(secondary_y=['City001_diff', 'City002_diff', 'City003_diff'])
ax.set_ylabel('Total Population')
ax.right_ax.set_ylabel('Change in the population')

null

PAGE_BREAK: PageBreak

10分で学ぶPython 第12回 サンプルをみながらグラフあれこれ-­matplotlib/seabornで色んなグラフを描こう,みよう­- [PDF]

10分で学ぶPython 第13回 サンプルをみながらグラフあれこれ-前回の続き-

より

import numpy as np
import matplotlib.pyplot as plt

plt.xkcd() # XKCDスタイルを適用,向こうで有名な漫画スタイル?
plt.plot(np.sin(np.linspace(0, 10)))
plt.title('Whoo Hoo!!!')

null

PAGE_BREAK: PageBreak

from pylab import *
import numpy as np

xkcd()
ylim([-10, 5])
xticks([])
yticks([])
xlabel('TIME', fontsize=20)
ylabel('Quolity of Life', fontsize=20)
data = np.hstack((np.linspace(-2, 0, 90), -np.arange(10)))
plot(data)
annotate('MONDAY', xy=(90, 0), arrowprops=dict(arrowstyle='->'), xytext=(15, -5), size=20)
show()

null

PAGE_BREAK: PageBreak

import numpy as np
import seaborn as sns

flip=1
x = np.linspace(0, 14, 100)
for i in range(1, 7):
    sns.plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)

sns.plt.savefig('no13_result01.png')
sns.plt.show()

null

PAGE_BREAK: PageBreak

import numpy as np
import seaborn as sns

x = np.random.normal(size=100)
sns.distplot(x)#デフォルトではsns.distplot(x, kde=True, rug=False)

sns.plt.savefig('no13_result02.png')
sns.plt.show()

null

PAGE_BREAK: PageBreak

titanic = sns.load_dataset("titanic")
sns.pointplot(x="class", y="survived", hue="sex", data=titanic,
              palette={"male": "g", "female": "m"},
              markers=["^", "o"], linestyles=["-", "--"])

sns.plt.savefig('no13_result03.png')
sns.plt.show()

null

ちなみに,

>sns.factorplot(x=”class”, y=”survived”, col=”sex”, data=titanic)

とすれば水準別のグラフが,

>sns.factorplot(x=”class”, y=”survived”, hue=”sex”, data=titanic,

          palette={"male": "g", "female": "m"},

          markers=["^", "o"], linestyles=["-", "--"])

とすれば同じグラフが描ける.

参考:

seaborn.factorplot-seaborn 0.7.1

PAGE_BREAK: PageBreak

titanic = sns.load_dataset("titanic")
sns.barplot(x="sex", y="survived", hue="class", data=titanic)

sns.plt.savefig('no13_result04.png')
sns.plt.show()

null

PAGE_BREAK: PageBreak上の2つのグラフを見比べるとよく分かるだろう.『sns.pointplot()』は所謂「折れ線グラフ」では無い.つまり,時系列データを可視化する為の方法ではなくて,棒グラフと同じニュアンスの方法になる.棒グラフの場合,水準内での変数比較には便利だが,水準間も含めた変数の比較(有意差の検討)には向かない.また,棒グラフは比較に好まれて使われるが,実は統計的妥当性に欠いた,あまり良い手法ではない.

上のグラフをみてもらえば分かるが,分かり易い様にみえて,実は『棒』の部分には意味が無い.重要なのは,棒の上端(平均を表している部分)とバー(標準偏差を表している部分)でしか無い.そういう意味でも,『sns.pointplot()』の方が,より便利でかつ統計的妥当性を有する(y_labelがmean(変数名)なのもまさにそれを表している).

ちなみに,seabornでは,これらは全て含有した『sns.factorplot()』がある.ファクタープロットの一形態として,『sns.pointplot()』『sns.barplot』という形式がある.

また,『sns.factorplot()』のパッケージ名は『pointplot_anova.py』になっている事からも,そのスキームが分かる.(『sns.pointplot()』はまさにANOVAを視覚化したもの;交互作用の判断はまさにこれ)

実用的な観点から云えば,有意差の検討等水準間,水準内の比較は『sns.factorplot()』,データの分布,構造を検討したい場合には『sns.boxplot()』を覚えておけば良いだろう.

PAGE_BREAK: PageBreak

import numpy as np
import seaborn as sns
import pandas as pd

mean, cov = [0, 1], [(1, .5), (.5, 1)]
data = np.random.multivariate_normal(mean, cov, 200)
df = pd.DataFrame(data, columns=['x', 'y'])
sns.jointplot(x='x', y='y', data=df)

sns.plt.savefig('no13_result05.png')
sns.plt.show()

null

sns.jointplot(x="x", y="y", kind="kde", data=df)#カーネル密度推定
sns.plt.savefig('no13_result06.png')

null

PAGE_BREAK: PageBreak

import seaborn as sns

iris = sns.load_dataset("iris") #サンプルデータセット
sns.pairplot(iris)#各変数のヒストグラムと全変数間の散布図

sns.plt.savefig('no13_result07.png')
sns.plt.show()

null

PAGE_BREAK: PageBreak

sns.pairplot(iris,hue="species")#各変数をカテゴリで色分け
sns.plt.savefig('no13_result08.png')

null

PAGE_BREAK: PageBreak

import seaborn as sns

# Load the long-form example gammas dataset
gammas = sns.load_dataset("gammas")

# Plot the response with standard error
sns.tsplot(data=gammas, time="timepoint", unit="subject",
           condition="ROI", value="BOLD signal")

sns.plt.savefig('no13_result09.png')

null

所謂,「折れ線グラフ」を描く関数はこれだろうね.ただ,あくまで「時系列データ」の折れ線グラフであって,単なる折れ線グラフを描く場合は,やはりplt.plot()を用いるべき.

参考:

Timeseries from DataFrame-seaborn0.7.1

PAGE_BREAK: PageBreak

import numpy as np; np.random.seed(22)
import seaborn as sns; sns.set(color_codes=True)
x = np.linspace(0, 15, 31)
data = np.sin(x) + np.random.rand(10, 31) + np.random.randn(10, 1)
ax = sns.tsplot(data=data)

sns.plt.savefig('no13_result10.png')

null

シャドーは信頼区間を表す.標準は1σ,約68%CIになっている.

PAGE_BREAK: PageBreak

一日一Python:scikit-learnでSVM/SVRを用いた為替の売買予測(その6)

より

纏めるだけで力尽きたので,簡単に.

null

Seabornでは標準のカラーパレットには6色しかなく,それ以上のデータが来ると色が被る.

なので,色を変えようと思うと,カラーパレットを設定しないといけない.それについての情報は割とある.

問題は,1つずつ指定したい場合.plt.plot()時には,一つずつ指定しながらプロットすれば良いが,

Pandas plotの場合は,一気にデータフレームから描画して,その後指定したい.が,それができない.

苦肉の策がこれ.

plt.figure()
with pd.plot_params.use('x_compat', True):
    Close_AlMTRX['Close'].plot(color='b')
    Close_AlMTRX['+03Band'].plot(color='g')
    Close_AlMTRX['-03Band'].plot(color='g')
    Close_AlMTRX['+09Band'].plot(color='y')
    Close_AlMTRX['-09Band'].plot(color='y')
    Close_AlMTRX['+40Band'].plot(color='r')
    Close_AlMTRX['-40Band'].plot(color='r')

日本語の情報が殆ど無くて,僕の理解になるけど.with構文で構文内のロジックを順次処理している感じ(try … finally … みたいな処理か).多分,plot_paramsはdict型のプロッティングパラメータで,x_compatは,Pandasは時系列データのティックレゾリューションが自動調整されるので,x軸のアライメント調整のためにx_compatを指定する感じ.

PAGE_BREAK: PageBreak

ma = Close_AlMTRX['Close'].rolling(25).mean()
mstd = Close_AlMTRX['Close'].rolling(25).std()
plt.figure()
plt.plot(Close_AlMTRX.index, Close_AlMTRX['Close'])
plt.fill_between(Close_AlMTRX.index, Close_AlMTRX['-03Band'], Close_AlMTRX['+03Band'])
plt.fill_between(Close_AlMTRX.index, Close_AlMTRX['-09Band'], Close_AlMTRX['+09Band'])
plt.fill_between(Close_AlMTRX.index, Close_AlMTRX['-40Band'], Close_AlMTRX['+40Band'])
plt.plot(ma.index, ma)
plt.fill_between(mstd.index, ma-2*mstd, ma+2*mstd, alpha=0.2)

nullnull

plt.fill_between(mstd.index, ma-2mstd, ma+2mstd, alpha=0.2)

で塗りつぶすことができる.シャドーを表現したい時に便利.

plt.は標準で上書きがTrueなので,重ねてグラフ描画すれば良い.

PAGE_BREAK: PageBreak

plt.figure()
with pd.plot_params.use('x_compat', True):
    Close_AlMTRX['Close'].plot(color='b')
    Close_AlMTRX['+03Band'].plot(color='g')
    Close_AlMTRX['-03Band'].plot(color='g')
    Close_AlMTRX['+09Band'].plot(color='y')
    Close_AlMTRX['-09Band'].plot(color='y')
    Close_AlMTRX['+40Band'].plot(color='r')
    Close_AlMTRX['-40Band'].plot(color='r')

ax = plt.plot(ma.index, ma)
ax = plt.fill_between(mstd.index, ma-2*mstd, ma+2*mstd, alpha=0.2)
ax = plt.fill_between(mstd.index, ma-3*mstd, ma+3*mstd, alpha=0.2)

null

null

組み合わせれば,こういうグラフが表現できる.という訳で,これまでの様々なグラフを再掲した.割と色々な取り組みをしていたなと思う.これをみれば,大体のグラフとか,やりたいことができるんじゃないだろうか.

カテゴリー: 未分類 パーマリンク

一日一Python:色々なグラフの描き方 への3件のフィードバック

  1. ピンバック: Pythonで直積,順列,組み合わせ,階乗の計算 | 粉末@それは風のように (日記)

  2. ピンバック: Requests: 人間のためのHTTP | 粉末@それは風のように (日記)

  3. ピンバック: facetplotでデータの情報構造を可視化 | 粉末@それは風のように (日記)

コメントは受け付けていません。