Plotly⑰(ヒートマップ)

ヒートマップ

Plotlyでヒートマップを表示するにはHeatmapクラスを使用します。

ヒートマップのデータとして、Heatmapクラス引数 zに2次元のリストデータを設定(9行目)します。

以下のコードでは、5行 5列の標準正規分に従う乱数を生成し(7行目)、ヒートマップに描画しています(9行目)。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
import numpy as np
import plotly.graph_objects as go

np.random.seed(9)
x = np.arange(0, 5)
y = np.arange(0, 50, 10)
z = np.random.randn(5, 5)

go.Figure([go.Heatmap(x=x, y=y, z=z)]).show()

[実行結果]

Plotly⑯(平行プロット)

平行プロット

Plotlyで平行プロットを表示するにはParcatsクラスを使用します。

Parcatsクラス引数 dimensionsには描画するデータを設定します。

データとしては、以下のキーを指定した辞書データをリストで渡します。(9~14行目)

  • label
    要素名(軸ラベルとして表示される)
  • values
    リストなどの値

軸間の線分を色分けするには、引数 line“color”をキーとしてリストなどのデータを値とした辞書データを設定します。(15行目)

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import plotly
import plotly.graph_objects as go

tips = plotly.data.tips()

go.Figure(
[
go.Parcats(
dimensions=[
{"label": "sex", "values": tips["sex"]},
{"label": "smoker", "values": tips["smoker"]},
{"label": "day", "values": tips["day"]},
{"label": "time", "values": tips["time"]}
],
line={"color": tips["size"]} # size列で色分け
)
]
).show()

[実行結果]

軸の上端をドラッグすると要素を左右に移動することができます。

また軸内の要素をドラッグすると、要素を上下に移動することもできます。

[実行結果(横軸と縦軸を移動)]

上図は、一番右に表示されていた“time”軸を左から2番目に移動し、“sex”軸のMaleとFemaleを上下に入れ替えています。

Plotly⑮(平行座標プロット)

平行座標プロット

Plotlyで平行座標プロットを表示するにはParcoordsクラスを使用します。

Parcoordsクラス引数 dimensionsに描画するデータを設定します。

データとしては、以下のキーを指定した辞書データをリストで渡します。(9~14行目)

  • label
    要素名(軸ラベルとして表示される)
  • values
    リストなどの値

軸間の線分を色分けするには、引数 line“color”をキーとしてリストなどのデータを値とした辞書を設定します。(15行目)

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import plotly
import plotly.graph_objects as go

iris = plotly.data.iris()

go.Figure(
[
go.Parcoords(
dimensions=[
{"label": "sepal_length", "values": iris["sepal_length"]},
{"label": "sepal_width", "values": iris["sepal_width"]},
{"label": "petal_length", "values": iris["petal_length"]},
{"label": "petal_width", "values": iris["petal_width"]}
],
line={"color": iris["species_id"]} # species_idで色分け
)
]
).show()

[実行結果]

軸の上端をドラッグすると要素を左右に移動することができます。

また軸上で任意の範囲をドラッグすると、その範囲の要素をハイライトして表示できます。

[実行結果(軸を移動し、ハイライト表示)]

上図は、一番右に表示されていた“petal_width”を左から2番目に移動し、その軸上の0.5から1.5の範囲を選択しハイライト表示(ピンク色)しています。

Plotly⑭(エラーバー)

エラーバー

Plotlyでエラーバーを表示するにはtraceerror_x属性またはerror_y属性を設定します。

設定する属性は下記の通りです。

  • type
    percent:エラー値を割合で指定
    constant:エラー値を定数で指定
    sqrt:値の平方根がエラー値となる
    data:各要素のエラー値を指定
  • symmetric
    True:対称なエラーバー
    False:非対称なエラーバー
  • array
    各要素のエラー値を指定
  • arrayminus
    エラーバーを非対称(symmetricをFalse)にした場合、各要素の負の値を指定
  • value
    エラー値を指定
  • valueminus
    エラーバーを非対称(symmetricをFalse)にした場合、エラー値の負の値を指定

以下のコードではエラー値を指定したグラフを描画しています。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots

np.random.seed(2)
x = np.arange(1, 6)
y = np.random.rand(5)

error_fig = make_subplots(rows=2, cols=2)

# エラーバーを一定の値で指定
error_fig.add_trace(
go.Scatter(
x=x,
y=y,
# エラーバーを定数で指定
error_y={"type": "constant", "value": 0.1},
),
row=1,
col=1
)
# 各要素ごとにエラーバーを指定
err_value = np.random.rand(5) * 0.1
error_fig.add_trace(
go.Scatter(
x=x,
y=y,
# 各要素のエラーバーを指定
error_x={"type": "data", "array": err_value},
),
row=1,
col=2
)
# エラーバーを正の値と負の値をそれぞれ指定
err_value_minus = np.random.rand(5) * 0.1
error_fig.add_trace(
go.Bar(
x=x,
y=y,
error_y={
"symmetric": False, # エラーバーを非対称
"type": "data",
"array": err_value,
"arrayminus": err_value_minus, # 各要素の負の値を指定
},
),
row=2,
col=1
)
error_fig.show()

[実行結果]

各グラフの説明は以下の通りです。

  • 左上の図
    Y値のエラーバーを一定の値で指定した折れ線グラフ
  • 右上の図
    各要素ごとにX値のエラーバーを指定した折れ線グラフ
  • 左下の図
    Y値のエラーバーに正の値と負の値をそれぞれ指定した棒グラフ

Plotly⑬(2次元ヒストグラム)

2次元ヒストグラムは2変数を2次元の座標にとり、2変数の値の組み合わせの頻度をカラースケールで表現します。

2次元ヒストグラム

Plotlyで2次元ヒストグラムを描画するにはHistogram2dクラスを使用します。

Histogram2dクラス引数 x, yにはリストなどのデータを設定します。

2次元ヒストグラムの同じ度数を等高線で描画するにはHistogram2dContour traceを使用します。

Histogram2dContourクラスHistogram2dクラスと同様の引数を使います。

以下のコードでは2つの正規分布に従う乱数を作成し、左図のサブプロットには2次元ヒストグラムを描画し、右図のサブプロットには等高線の2次元ヒストグラムを描画しています。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots

np.random.seed(1)
data0 = np.random.normal(10, 1, 10000)
data1 = np.random.normal(12, 1.5, 10000)

histogram2d_fig = make_subplots(rows=1, cols=2)
# 2次元ヒストグラム(左図)
histogram2d_fig.add_trace(go.Histogram2d(x=data0, y=data1), row=1, col=1)
# 等高線(右図)
histogram2d_fig.add_trace(
go.Histogram2dContour(x=data0, y=data1, showscale=False), row=1, col=2
)
histogram2d_fig.update_layout(coloraxis_showscale=False)
histogram2d_fig.show()

[実行結果]

Plotly⑫(ヒストグラム その2)

前回に引き続きヒストグラムを描画します。

(データセットの読み込みやimportは前回記事で実行済みとします)

ヒストグラムの種類

Histogramクラス引数 histnormに以下を指定すると、ヒストグラムの種類を変更することができます。

  • percent
    合計を100とした相対度数(百分率)
  • probability
    合計を1とした相対度数
  • density
    密度推定
  • probability density
    合計を1とした密度推定

累積ヒストグラムを描画するにはtracecomulative.enable属性をTrueに設定します。(14行目)

次のコードでは左図のサブプロットに相対度数にしたヒストグラム、右図のサブプロットには累積ヒストグラムを描画しています。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
probability_comulative_histogram_fig = make_subplots(rows=1, cols=2)
probability_comulative_histogram_fig.add_trace(
go.Histogram(
x=data0,
histnorm="probability", # サンプル数の合計を1とした正規化
name="probability"
),
row=1,
col=1
)
probability_comulative_histogram_fig.add_trace(
go.Histogram(
x=data0,
cumulative={"enabled": True}, # 累積ヒストグラム
name="comulative"
),
row=1,
col=2
)
probability_comulative_histogram_fig.show()

[実行結果]

ヒストグラムの範囲指定

ヒストグラムの範囲を指定する場合には、xbins属性を設定します。

  • start
    開始位置
  • end
    終了位置
  • size
    階級の幅

次のコードでは開始位置 6、終了位置 13、階級の幅 0.01と設定したヒストグラムを描画しています。(5行目)

[Google Colaboratory]

1
2
3
4
5
6
7
go.Figure(
go.Histogram(
x=data0,
# ヒストグラムの範囲を指定
xbins={"start": 6, "end": 13, "size": 0.01}
)
).show()

[実行結果]

Plotly⑪(ヒストグラム)

ヒストグラム

Plotlyでヒストグラムを描画するにはHistogramクラスを使います。

Histgramクラスの引数 xにはリストなどのデータを設定します。(11~12行目)

以下のコードでは、正規分布に従う乱数を生成しヒストグラムを描画しています。

右図にはヒストグラムの階級(ビン)の数を50に設定し、横向きに描画します。

引数 yにデータを渡すと横向きになり(18行目)、引数 nbinsyに自然数を渡すと階級(ビン)を変更できます(20行目)。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import numpy as np
import plotly.graph_objects as go
from plotly.subplots import make_subplots

np.random.seed(1)
data0 = np.random.normal(10, 1, 10000)
data1 = np.random.normal(12, 1.5, 10000)
histogram_fig = make_subplots(rows=1, cols=2)

# 左図
histogram_fig.add_trace(go.Histogram(x=data0, name="data0"), row=1, col=1)
histogram_fig.add_trace(go.Histogram(x=data1, name="data1"), row=1, col=1)

# 右図
histogram_fig.add_trace(go.Histogram(y=data0, name="data0"), row=1, col=2)
histogram_fig.add_trace(
go.Histogram(
y=data1, # 引数yで横向き
name="data1",
nbinsy=50 # ビンの数を変更
),
row=1,
col=2
)
histogram_fig.show()

[実行結果]

ヒストグラムを積み上げるにはLayoutクラス引数 barmode“stack”を設定します。(3行目)

以下のコードでは、data0の上にdata1のヒストグラムを積み上げて描画しています。

[Google Colaboratory]

1
2
3
4
go.Figure(
[go.Histogram(x=data0, name="data0"), go.Histogram(x=data1, name="data1")],
layout=go.Layout(barmode="stack"), # ヒストグラムを積み上げ
).show()

[実行結果]

Plotly⑩(バイオリン図)

今回は、Plotlyでバイオリン図を描画してみます。

データの読み込み

まずはデータを読み込みます。

準備するデータはtipsデータセット(レストランの支払金額とチップの金額)です。

tipsデータセットから曜日ごとのデータを取り出しています。(7~10行目)

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
import plotly
import plotly.graph_objects as go

tips = plotly.data.tips()

# 曜日ごとのデータを抽出
tips_by_day = tips.groupby("day") # day列でグループ化
days = ["Thur", "Fri", "Sat", "Sun"]
# グループ化された各DataFrameを抽出
thur, fri, sat, sun = [tips_by_day.get_group(day) for day in days]
thur.head()

[実行結果(金曜を抽出したデータ)]

バイオリン図

Plotlyでバイオリン図を描画するにはViolinクラスを使います。

Violinクラスの引数 yにはリストなどのデータを設定します。

次のコードでは、1列目のサブプロットでバイオリン図に箱ひげ図を重ねて描画し、2列目のサブプロットではsmoker列のデータを左右に分けて描画しています。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from plotly.subplots import make_subplots

violin_fig = make_subplots(rows=1, cols=2)
# 1列目のサブプロット
violin_fig.add_trace(
go.Violin(
y=thur["tip"],
name="Thur",
box_visible=True # 箱ひげ図を重ねて描画
),
row=1,
col=1
)
violin_fig.add_trace(
go.Violin(y=fri["tip"], name="Fri", box_visible=True), row=1, col=1
)
violin_fig.add_trace(
go.Violin(y=sat["tip"], name="Sat", box_visible=True), row=1, col=1
)
violin_fig.add_trace(
go.Violin(y=sun["tip"], name="Sun", box_visible=True), row=1, col=1
)

# 2列目のサブプロット
for data in thur, fri, sat, sun:
smoker = data.loc[data["smoker"] == "Yes"] # smoker列がYesのデータ
non_smoker = data.loc[data["smoker"] == "No"] # smoker列がNoのデータ
day = data["day"].iloc[0] # day列の先頭のデータ(ラベルに使用)
violin_fig.add_trace(
go.Violin(
x=smoker["day"],
y=smoker["tip"],
side="negative", # 左側に描画
name=f"{day}: somoker",
),
row=1,
col=2
)
violin_fig.add_trace(
go.Violin(
x=non_smoker["day"],
y=non_smoker["tip"],
side="positive", # 右側に描画
name=f"{day}: non-somoker",
),
row=1,
col=2
)
violin_fig.show()

[実行結果]

Violinクラスの引数 box_visibleTrueを渡すとバイオリン図に箱ひげ図を重ねて描画します。(9,15,18,21行目)

引数 side“negative”を渡すと左側に描画(33行目)し、“positive”を渡すと右側に描画(43行目)します。

Plotly⑨(箱ひげ図)

今回は、Plotlyで箱ひげ図を描画してみます。

データの読み込み

まずはデータを読み込みます。

準備するデータはtipsデータセット(レストランの支払金額とチップの金額)です。

[Google Colaboratory]

1
2
3
4
5
import plotly
import plotly.graph_objects as go

tips = plotly.data.tips()
tips.head()

[実行結果]

箱ひげ図

Plotlyで箱ひげ図を描画するにはBoxクラスを使います。

Boxクラスの引数 yにはリストなどのデータを設定します。

次のコードでは、tipsデータセットから曜日ごとのデータを取り出し、箱ひげ図で描画しています。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
# 曜日ごとのデータを抽出
tips_by_day = tips.groupby("day") # day列でグループ化
days = ["Thur", "Fri", "Sat", "Sun"]

# グループ化された各DataFrameを抽出
thur, fri, sat, sun = [tips_by_day.get_group(day) for day in days]

box_fig = go.Figure()
box_fig.add_trace(go.Box(y=thur["tip"], name="Thur"))
box_fig.add_trace(go.Box(y=fri["tip"], name="Fri"))
box_fig.add_trace(go.Box(y=sat["tip"], name="Sat"))
box_fig.add_trace(go.Box(y=sun["tip"], name="Sun"))
box_fig.show()

[実行結果]

Plotly⑧(テーブル)

テーブル

Plotlyでテーブル(表)を描画するにはTableクラスを使います。

Tableクラスcells属性およびheader属性には下記のようなオプションを設定します。

  • values
    セルの値(リストなどのデータを渡す)
  • height
    セルの高さ
  • align
    配置:”left”(左詰め)、”center”(中央寄せ)、”right”:(右詰め)
  • line
    width 罫線の太さ
    color 罫線の色
  • fill
    color 塗りつぶし色

次のコードでは、テーブルと折れ線グラフを描画しています。右上のテーブルにはスタイルを設定しています。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots

table_values = [[10, 20, 30, 40], [34, 15, 27, 8]]
table_labels = ["Label1", "Label2"]
table_fig = make_subplots(
rows=2,
cols=2,
specs=[[{"type": "domain"}, {"type": "domain"}], [{"colspan": 2}, None]],
)
table_fig.add_trace(
go.Table(header={"values": table_labels}, cells={"values": table_values}),
row=1,
col=1,
)
table_fig.add_trace(
go.Table(
cells={
"values": pd.DataFrame(table_values),
"line": {"width": 2, "color": "black"}, # 罫線のスタイル
"fill": {"color": "white"}, # 塗りつぶし色
"align": "right", # 配置
},
header={
"values": table_labels,
"height": 18, # セルの高さ
"line": {"width": 2, "color": "black"},
"fill": {"color": "white"},
"font": {"size": 10}, # フォントサイズ
},
),
row=1,
col=2,
)
table_fig.add_trace(
go.Scatter(x=table_values[0], y=table_values[1]), row=2, col=1
)
table_fig.show()

[実行結果]

cells.values属性の各要素は列の値となります。

pandas.DataFrameを設定する場合には、行列が転置されるためご注意ください。