Plotly

【plotlyチュートリアル】<>エラーバー付きグラフ作成

本記事ではPythonのグラフライブラリとして使えるplotlyによる「エラーバー付きグラフ」の作成について紹介します。

エラーバーの利用場面としてデータ区間を示すエラーバー標準偏差・標準誤差・95%信頼区間などをエラーバーで示し、データの有意差を可視化して直感的に伝えるなどが挙げられます。

plotlyチュートリアルのエラーバーから例題を抜粋しながら解説していきます。

①基本的なエラーバー付き散布図

②graph_objectsを使ったエラーバー付き散布図

③エラーバー付きの棒グラフ

④おまけ:レイアウトの変更色々

今回紹介する例題ではグラフの元データを容易する必要がなく、下記プログラムを完コピすればグラフを作成することができます。

まずは実際に手を動かしてコードを書いて見てください。

AnacondaのインストールとJupyter notebookの準備

Anacondaのインストールがまだの方はこちらの記事を参考に準備してください。

Jupyter notebookの起動と使い方まで紹介しています。

【2020年版、Python3をはじめよう!(Mac&Win対応)】AnacondaとJupyter notebookの始め方 はじめに Jupyter notebookとは Jupyter notebook(ジュピター・ノートブック)はブラウザ上で...

plotlyとplotly_expressのインストール

導入から基本的な使い方まで紹介しています。

Pythonをグラフ作成で学ぶ【plotly_expressで1行プログラミング】 【本記事の目標】 たった1行で動くグラフを作成し、体感する! これからPythonを学びたい人向けに朗報です。 今から紹介...

①基本的なエラーバー付き散布図

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

②graph_objectsを使ったエラーバー付き散布図

ここでは、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に関する書籍紹介

↓Plotlyについて学べる数少ない参考書です。

Mickey@コーヒー好きエンジニア

【製造業×プログラミング×AI】Python/VBAを活用した業務改善、Streamlit/Plotlyを活用したWebアプリ開発について初心者向けに発信中|趣味は自家焙煎コーヒー作り|noteでは焙煎理論を発信|ココナラではプログラミングに関する相談,就職/転職やコーヒーに関する相談などのサービスをやっています