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を設定する場合には、行列が転置されるためご注意ください。

Plotly⑦(ツリーマップ)

ツリーマップ

Plotlyでツリーマップを描画するにはTreemapクラスを使います。

Treemapクラスの引数は下記の通りです。(Sunburstクラスと同様)

  • labels
    セクタごとのラベルを設定。
  • parents
    親セクタごとのラベルを設定。
    最上位の階層にする場合は空の文字列を設定。
  • values
    セクタごとの値を設定。
  • branchvalues
    値を合計する方法を設定。
    “total”:親が子の階層すべての合計
    “remainder”:子が親とは別の値

[Google Colaboratory]

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

asset_labels = ["資産", "債権", "A社", "B社", "株式", "C社", "D社", "預金","Z社"]
asset_parents = ["", "資産", "債権", "債権", "資産", "株式", "株式", "資産","B社"]
asset_values = [1000, 400, 300, 100, 200, 160, 40, 400, 50]

go.Figure(
go.Treemap(
labels=asset_labels, # セクタごとのラベル
parents=asset_parents, # 親セクタのラベル
values=asset_values, # セクタごとの値
branchvalues="total" # 親が子の階層すべての合計値
)
).show()

[実行結果]

ツリーマップの特定の階層をクリックすると、その階層がドリルダウンして描画されます。

特定階層を選択した状態から、親の階層をクリックすると元のグラフに戻ります。

[実行結果 (債権を選択)]

Plotly⑥(サンバーストグラフ)

サンバーストグラフ

Plotlyでサンバーストグラフを描画するにはSunburstクラスを使います。

Sunburstクラスの引数は下記の通りです。

  • labels
    セクタごとのラベルを設定。
  • parents
    親セクタごとのラベルを設定。
    最上位の階層にする場合は空の文字列を設定。
  • values
    セクタごとの値を設定。
  • branchvalues
    値を合計する方法を設定。
    “total”:親が子の階層すべての合計
    “remainder”:子が親とは別の値

次のコードでは、左図に親が子の階層すべての合計となるサンバーストグラフを表示し、左図に子が親とは別の値となるサンバーストグラフを描画しています。

[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
import plotly.graph_objects as go
from plotly.subplots import make_subplots

asset_labels = ["資産", "債権", "A社", "B社", "株式", "C社", "D社", "預金","Z社"]
asset_parents = ["", "資産", "債権", "債権", "資産", "株式", "株式", "資産","B社"]
asset_values = [1000, 400, 300, 100, 200, 160, 40, 400, 50]

sunburst_fig = make_subplots(
1, 2, specs=[[{"type": "domain"}, {"type": "domain"}]]
)

sunburst_fig.add_trace(
go.Sunburst(
labels=asset_labels, # セクタごとのラベル
parents=asset_parents, # 親セクタのラベル
values=asset_values, # セクタごとの値
branchvalues="total", # 親が子の階層すべての合計値
),
row=1,
col=1,
)

sunburst_fig.add_trace(
go.Sunburst(
labels=asset_labels,
parents=asset_parents,
values=asset_values,
branchvalues="remainder", # 子が親とは別の値
),
row=1,
col=2,
)

sunburst_fig.show()

[実行結果]

サンバーストグラフの特定の階層をクリックすると、その階層がドリルダウンして描画されます。

特定階層を選択した状態から、親の階層をクリックすると元のグラフに戻ります。

[実行結果 (左図:債権を選択 右図:株式を選択)]

Plotly⑤(円グラフ)

円グラフ

Plotlyで円グラフを描画するにはPieクラスを使います。

Pieクラスの引数 valuesにリストなどのデータを設定すると、百分率が自動で算出された円グラフが表示されます。(8行目)

また、引数 labelsに各要素のラベルを設定すると凡例やホバーツールに表示されます。

[Google Colaboratory]

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

companies = ["A社", "B社", "C社", "D社"]
sales_2020 = [900, 700, 200, 100]
sales_2021 = [1400, 980, 450, 380]

go.Figure(
go.Pie(labels=companies, values=sales_2020),
layout=go.Layout(title="売上"), # figureのタイトル
).show()

[実行結果]

複数の円グラフ

複数の円グラフを表示しつつ、合計値の大きさの比率で比較してみます。

Pieクラスの引数 scalegroupに文字列を渡すと、同じ文字列で指定されたtraceの合計値に応じて円グラフ全体の面積が調整されます。(13,22行目)

2つのデータの合計値を比較した円グラフを表示するコードは、下記のようになります。

[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
from plotly.subplots import make_subplots

sales_pie_fig = make_subplots(
rows=1,
cols=2,
specs=[[{"type": "domain"}, {"type": "domain"}]],
subplot_titles=["2020年の売上", "2021年の売上"], # サブプロットのタイトル
)
sales_pie_fig.add_trace(
go.Pie(
labels=companies,
values=sales_2020, # 同じscalegroupでサイズが調整される
scalegroup="sales",
),
row=1,
col=1,
)
sales_pie_fig.add_trace(
go.Pie(
labels=companies,
values=sales_2021,
scalegroup="sales"), # 同じscalegroupでサイズが調整される
row=1,
col=2,
)
sales_pie_fig.show()

[実行結果]

Plotly④(面グラフ)

面グラフ

Plotlyで面グラフを描画するには折れ線グラフや散布図と同じようにScatterクラスを使います。

Scatterクラスの引数 fill“tozeroy”を指定すると、領域を塗りつぶして表示することができます。(10行目)

また、引数 mode“none”を設定すると、線とマーカーが描画されなくなります。(11行目)

[Google Colaboratory]

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

np.random.seed(7)
area_x = np.arange(15)
area_y1, area_y2 = np.random.rand(2, 15) # 一様乱数を生成
area_trace = go.Scatter(x=area_x,
y=area_y1,
name="area1",
fill="tozeroy", # 0からY値まで塗りつぶし,
mode="none", # 線とマーカーを描画しない
fillcolor="mediumslateblue" # 塗りつぶし色
)
area_fig = go.Figure([area_trace])
area_fig.show()

[実行結果]

面グラフ(積み上げ)

面グラフを積み上げるには、複数のtraceをfigureに設定します。

traceが複数ある場合、Scatterクラスの引数fillに“tozeroy”を渡すと同じ領域を塗りつぶしてしまうため、重なった領域の塗りつぶしの色が混合してしまいます。

これを回避するには塗りつぶす領域の範囲をtrace間の値とします。

引数 fill“tonexty”を渡すと、前のtraceからY値までの領域を塗りつぶします。(4行目)

以下のコードでは、2つの要素を面グラフで描画し、2番目の要素の塗りつぶし領域を前の要素のY値からとしています。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
next_area_trace = go.Scatter(x=area_x,
y=area_y1 + area_y2,
name="area2",
fill="tonexty", # 前のtraceからY値までを塗りつぶし
mode="none",
fillcolor="lightpink"
)
stacked_area_fig = go.Figure([area_trace, next_area_trace])
stacked_area_fig.show()

[実行結果]