本記事ではPythonのグラフライブラリとして使えるplotlyによる「エラーバー付きグラフ」の作成について紹介します。
エラーバーの利用場面としてデータ区間を示すエラーバーや標準偏差・標準誤差・95%信頼区間などをエラーバーで示し、データの有意差を可視化して直感的に伝えるなどが挙げられます。
plotlyチュートリアルのエラーバーから例題を抜粋しながら解説していきます。
①基本的なエラーバー付き散布図
②graph_objectsを使ったエラーバー付き散布図
③エラーバー付きの棒グラフ
④おまけ:レイアウトの変更色々
今回紹介する例題ではグラフの元データを容易する必要がなく、下記プログラムを完コピすればグラフを作成することができます。
まずは実際に手を動かしてコードを書いて見てください。
Anacondaのインストールがまだの方はこちらの記事を参考に準備してください。
Jupyter notebookの起動と使い方まで紹介しています。
導入から基本的な使い方まで紹介しています。
plotly_express、plotly_graph_objectsを使用するので、まずはインポートします。
import plotly.express as px
import plotly.graph_objects as go
次にデータを用意します。
今回はplotly_expressで用意されているpx.data.iris()を使用します。
px.data.iris()にはアヤメ(iris)のデータが格納されています。
がくの長さ(sepal_length)、 がくの幅(sepal_width)、 花弁の長さ(petal_length)、 花弁の幅(petal_width)、 アヤメの品種(species)、 品種No.(species_id)の情報が入っています。
さらにsepal_widthを100で割った値として、今回使用するエラーバー用のデータを準備します(e)。
df = px.data.iris()
df["e"] = df["sepal_width"]/100
dfの中身を見てみます。
px.scatterでエラーバーを含む散布図を書いていきます。
fig=px.scatter()がplotly_express(px)で散布図(scatter)を使いますよという意味です。
figはただの変数なので何でも大丈夫です。figure=図を意味しているので良く使われる表現です。
xとyに使用するデータをそれぞれ、x=”sepal_width”、y=”sepal_length”とします。
color=”species”で品種別に色分けされたプロットとします。
最後がエラーバーの指定です。
error_x=”e”、error_y=”e”でxとyのエラーバーに使用する値を指定でき、今回は同じeの値を使います。
fig.show()で実際に表示してみます。
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species",
error_x="e", error_y="e")
fig.show()
また、エラーバーに使う値を最小値、最大値で分けて表示したい場合にはdfにあらかじめ列を用意すれば可能です。
df["e_plus"] = df["sepal_width"]/100
df["e_minus"] = df["sepal_width"]/40
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species",
error_y="e_plus", error_y_minus="e_minus")
fig.show()
ここでは、plotly.graph_objectsを使用するエラーバー付き散布図について紹介します。
go.Figure(data=go.Satter(●●))で散布図が書けます。
yの値のエラーバー(error_y)を辞書型(dict(●●))で書いていきます。
type=’data’とする事で数値をそのまま±誤差として表示するようになります。
fig = go.Figure(data=go.Scatter(
x=[0, 1, 2],
y=[6, 10, 2],
error_y=dict(
type='data', # value of error bar given in data coordinates
array=[1, 2, 3],
visible=True)
))
fig.show()
次の例ではsymmetric=Falseとして、array、arrayminusを与える事で±のエラー値をそれぞれで設定する例です。
fig = go.Figure(data=go.Scatter(
x=[1, 2, 3, 4],
y=[2, 1, 3, 4],
error_y=dict(
type='data',
symmetric=False,
array=[0.1, 0.2, 0.1, 0.1],
arrayminus=[0.2, 0.4, 1, 0.2])
))
fig.show()
type=’percent’とすることで割合に応じたエラーバーの範囲となります。
value=50は50%を意味しているのでy値の半分の値がエラー範囲になります。
fig = go.Figure(data=go.Scatter(
x=[0, 1, 2],
y=[6, 10, 2],
error_y=dict(
type='percent', # value of error bar given as percentage of y value
value=50,
visible=True)
))
fig.show()
次の例でもsymmetric=Falseとして、value、valueminusを与える事で±のエラー値をそれぞれで設定する例です。
fig = go.Figure(data=go.Scatter(
x=[1, 2, 3, 4],
y=[2, 1, 3, 4],
error_y=dict(
type='percent',
symmetric=False,
value=15,
valueminus=25)
))
fig.show()
これまでと同様にerror_yの部分をerror_xとするとx値のエラーバーを調整できます。
fig = go.Figure(data=go.Scatter(
x=[1, 2, 3, 4],
y=[2, 1, 3, 4],
error_x=dict(
type='percent',
value=10)
))
fig.show()
fig=go.Figure()、fig.add_trace(●●)で複数の系列のグラフを次々に追加できます。
そして、go.Scatterの部分をgo.Barに変更すると棒グラフが書けます。
エラーバーの部分は今までと同様に調整ができます。
fig = go.Figure()
fig.add_trace(go.Bar(
name='Control',
x=['Trial 1', 'Trial 2', 'Trial 3'], y=[3, 6, 4],
error_y=dict(type='data', array=[1, 0.5, 1.5])
))
fig.add_trace(go.Bar(
name='Experimental',
x=['Trial 1', 'Trial 2', 'Trial 3'], y=[4, 7, 3],
error_y=dict(type='data', array=[0.5, 1, 2])
))
fig.update_layout(barmode='group')
fig.show()
エラーバーの仕様でtype、color、thickness、widthなども変更するサンプルとして参考になります。
import numpy as np
x_theo = np.linspace(-4, 4, 100)
sincx = np.sinc(x_theo)
x = [-3.8, -3.03, -1.91, -1.46, -0.89, -0.24, -0.0, 0.41, 0.89, 1.01, 1.91, 2.28, 2.79, 3.56]
y = [-0.02, 0.04, -0.01, -0.27, 0.36, 0.75, 1.03, 0.65, 0.28, 0.02, -0.11, 0.16, 0.04, -0.15]
fig = go.Figure()
fig.add_trace(go.Scatter(
x=x_theo, y=sincx,
name='sinc(x)'
))
fig.add_trace(go.Scatter(
x=x, y=y,
mode='markers',
name='measured',
error_y=dict(
type='constant',
value=0.1,
color='purple',
thickness=1.5,
width=3,
),
error_x=dict(
type='constant',
value=0.2,
color='purple',
thickness=1.5,
width=3,
),
marker=dict(color='purple', size=8)
))
fig.show()
以上で解説は終わりです。
↓Plotlyについて学べる数少ない参考書です。