Plotly③(棒グラフ)

棒グラフ

棒グラフを表示するにはBarクラスを使用します。

引数 orientation“h”を渡すと横向きの棒グラフになります。(14行目)

[Google Colaboratory]

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

bar_fig = make_subplots(rows=2, cols=2, subplot_titles=["ラベル", "座標", "横"])

# X値が文字列型の場合
bar_fig.add_trace(go.Bar(x=["a", "b", "c", "d", "e"], y=[8, 3, 5, 4, 2]), row=1, col=1)

# X値が数値型の場合
bar_fig.add_trace(go.Bar(x=[0, 1, 2, 4, 5], y=[1, 4, 2, 3, 2]), row=1, col=2)

# 横向きの棒グラフの場合
bar_fig.add_trace(
go.Bar(x=[3, 2, 1, 5], y=[1, 2, 3, 4], orientation="h"), row=2, col=1
)

bar_fig.show()

[実行結果]

棒グラフ(グループ化)

Figure関数に複数のBar traceを渡すと、グループ化した棒グラフを描画することができます。

[Google Colaboratory]

1
2
3
4
bar_trace1 = go.Bar(x=["a", "b", "c", "d", "e"], y=[3, 5, 2, 1, 6], name="group1")
bar_trace2 = go.Bar(x=["a", "b", "c", "d", "e"], y=[4, 3, 5, 2, 1], name="group2")
grouped_fig = go.Figure([bar_trace1, bar_trace2])
grouped_fig.show()

[実行結果]

棒グラフ(積み上げ)

Layoutクラスの引数 barmode“stack”を渡すと、積み上げ棒グラフを描画することができます。(3行目)

[Google Colaboratory]

1
2
3
4
5
stacked_fig = go.Figure(
[bar_trace1, bar_trace2],
layout=go.Layout(barmode="stack") # 積み上げ棒グラフにするためlayoutを設定
)
stacked_fig.show()

[実行結果]

棒グラフ(マイナス方向に積み上げ)

Layoutクラスの引数 barmode“relative”を渡すと、値が0未満の要素を下方向に積み上げて表示することができます。(4行目)

[Google Colaboratory]

1
2
3
4
5
6
bar_trace3 = go.Bar(x=["a", "b", "c", "d", "e"], y=[-2, -3, 1, -4, 2], name="group3")
relative_fig = go.Figure(
[bar_trace1, bar_trace2, bar_trace3],
layout=go.Layout(barmode="relative") # 0未満の値をした方向に積み上げるlayoutを作成
)
relative_fig.show()

[実行結果]

Plotly②(散布図)

散布図

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

Scatterクラスの引数 mode“markers”を指定すると散布図が表示できます。

正規分布に従う乱数を生成し、散布図を描画してみます。

[Google Colaboratory]

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

np.random.seed(1)
scatter_x, scatter_y = np.random.randn(2, 100) # 正規分布に従う乱数を生成
go.Figure(
go.Scatter(x=scatter_x,
y=scatter_y,
name="standard normal distribution",
mode="markers" # 描画モードを散布図に設定
)
).show()

[実行結果]

散布図(バブルチャート)

バブルチャートは散布図の要素の大きさで値を表現したグラフです。

散布図の要素の大きさを設定するにはmarker.size属性にリストデータを設定します。(10行目)

また、marker.color属性にリストデータを設定するとカラースケールで表示することができます。(11行目)

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
np.random.seed(1)
scatter_color = np.random.rand(100)
scatter_size = np.random.rand(100) * 30
go.Figure(
go.Scatter(x=scatter_x,
y=scatter_y,
name="4d",
mode="markers",
marker={
"size": scatter_size, # 要素ごとに大きさを指定
"color": scatter_color, # 要素の大きさを色で表現
"sizemode": "diameter", # 大きさを直径で指定
"opacity": 0.8, # 要素の不透明度
"showscale": True # カラースケールを表示
}
)
).show()

[実行結果]

散布図(高速描画)

大きなデータを扱う場合、WebGLで実装されたScatterglクラスを使用することで高速に描画できます。

下記のコードでは、1万個の乱数を散布図に描画しています。

[Google Colaboratory]

1
2
3
np.random.seed(1)
large_x, large_y = np.random.randn(2, 10000)
go.Figure([go.Scattergl(x=large_x, y=large_y, mode="markers")]).show()

[実行結果]

Plotly①(折れ線グラフ)

今回から、plotly.pyを使っていろいろなグラフの描画を行っていきます。

株価データ

まずはデータを準備します。

読み込むデータは株価データです。

[Google Colaboratory]

1
2
3
4
import plotly

stocks = plotly.data.stocks()
stocks.head()

[実行結果]

折れ線グラフ

折れ線グラフを描画するためにはScatter関数を利用します。

引数 xに日付データ(date)、引数 yにはGoogleの株価(GOOG)を設定しています。

[Google Colaboratory]

1
2
import plotly.graph_objects as go
go.Figure(go.Scatter(x=stocks["date"], y=stocks["GOOG"])).show()

[実行結果]

折れ線グラフ(スライダ付き)

スライダを使うと、描画範囲を変更したり、指定した範囲の描画位置の移動ができるようになります。

Range Sliderを表示するにはlayoutのxaxis.rangeslider.visible属性にTrueを設定します。(4行目)

また、Range Selectorは1か月や1週間など、期間を固定した範囲指定ができます。(5~11行目)

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ts_layout = go.Layout(
# X軸のRange SliderとRange Selectorを表示
xaxis={
"rangeslider": {"visible": True}, # RangeSliderを表示
"rangeselector": { # RangeSelectを設定
"buttons": [
{"label": "1m", "step": "month", "count": 1}, # 1ヵ月
{"label": "7d", "step": "day", "count": 7}, # 7日間
{"step": "all"}, # 全期間
]
},
}
)

go.Figure(
go.Scatter(x=stocks["date"], y=stocks["GOOG"]), layout=ts_layout
).show()

[実行結果]

Range Slider(下側のグラフ)で描画範囲や描画位置を変更して表示することができます。

またグラフ左上のRange Selector(1m/7d/all)をボタンを押すと、固定された期間でグラフの表示が切り替わります。

Plotly Express㉓(3D散布図)

今回は、3D散布図を表示します。

データの読み込み

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

準備するデータはgapminderデータセット(年・国ごとの平均寿命と一人当たりのGDP)です。

[Google Colaboratory]

1
2
3
4
import plotly.express as px

gapminder = px.data.gapminder()
gapminder.head()

[実行結果]

3D散布図

3D散布図を描画するには、次の2つの関数のいずれかを使います。

  • scatter_3d
    3D散布図を表示する。
  • line_3d
    3D折れ線グラフを表示する。

引数の x, y, z にはグラフに表示するデータを設定します。

また、引数sizeには要素の大きさを表すデータを設定し、引数colorにはカラースケールで表示するデータを設定します。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
scatter_3d_fig = px.scatter_3d(gapminder,               # データセット
x="year", # X軸のデータ
y="continent", # Y軸のデータ
z="pop", # Z軸のデータ
size="gdpPercap", # 要素の大きさ
color="lifeExp", # lifeExp列で色分け
hover_data=["country"] # ホバーツールに表示
)
scatter_3d_fig.layout.update(scene={"zaxis": {"type": "log"}}) # Z軸を対数にとる
scatter_3d_fig.show()

[実行結果]

グラフを選択しドラッグすると、グラフの角度を変えて見ることができます。

Plotly Express㉒(地図上の散布図)

今回は、地図上に散布図を表示します。

データの読み込み

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

準備するデータはgapminderデータセット(年・国ごとの平均寿命と一人当たりのGDP)となります。

[Google Colaboratory]

1
2
3
4
import plotly.express as px

gapminder = px.data.gapminder()
gapminder.head()

[実行結果]

地図上の散布図

地図上に散布図を表示するにはscatter_geo関数を使用します。

各引数の意味は下記の通りです。

  • locations
    位置データ。alpha-3形式の位置データ(iso_alpha)を設定。
  • size
    要素の大きさ。一人当たりのGDP(gdpPercap)を設定。
  • color
    カラースケールで表示。平均寿命(lifeExp)を設定。
  • animation_frame
    スライドバーを表示し、データを変えて表示可能。年(year)を設定。

[Google Colaboratory]

1
2
3
4
5
6
7
px.scatter_geo(gapminder,               # データセット
locations="iso_alpha", # 位置をISO 3166-1 alpha-3形式で指定
size="gdpPercap", # 要素のサイズ
color="lifeExp", # 要素の色
hover_name="country", # ホバーツールのタイトル
animation_frame="year" # アニメーション
).show()

[実行結果]

Plotly Express㉑(階級区分図)

階級区分図(コロプレスマップ)は、値に合わせた色調に塗り分けた地図です。

地域ごとの値をカラースケールで表現します。

データの読み込み

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

準備するデータはgapminderデータセット(年・国ごとの平均寿命と一人当たりのGDP)の2007年分を抽出したものとなります。

[Google Colaboratory]

1
2
3
4
5
import plotly.express as px

gapminder = px.data.gapminder()
gapmider_2007 = gapminder[gapminder["year"] == 2007]
gapmider_2007.head()

[実行結果]

階級区分図

階級区分図を描画するためにはchoropleth関数を使用します。

引数 locationsに位置データとなる列名、引数 colorに値となる列名を渡します。

引数 locationmodeでは位置の形式を文字列で指定します。デフォルトは“ISO-3”です。

以下のコードではiso_alpha列(ラテン文字3文字による国名コード)ごとのlifeExp列(平均寿命)の値を階級区分図で表示します。

ホバーツールのタイトルにcountry列のデータを指定しています。

[Google Colaboratory]

1
2
3
4
5
px.choropleth(gapmider_2007,
locations="iso_alpha", # 位置をISO 3166-1 alpha-3形式で指定
color="lifeExp", # 平均寿命
hover_name="country", # ホバーツールのタイトル
).show()

[実行結果]

Plotly Express⑳(ポーラチャート)

ポーラチャートは、各変数が放射状の座標軸をもち、値が点や線、扇形の面積で表現されます。

データの読み込み

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

準備するデータは風力データセット(風向きや風の強さ)です。

[Google Colaboratory]

1
2
3
4
import plotly.express as px

wind = px.data.wind()
wind.head()

[実行結果]

ポーラチャート

ポーラチャートを描画するには、下記の関数を使用します。

  • scatter_polar
    散布図(点で描画)
  • line_polar
    レーダチャート(線で描画)
  • bar_polar
    鶏頭図(棒で描画)

引数rに極座標の原点からの距離を与える列名を指定し、引数thetaには角度(度数法)となる列名を指定します。

引数thetaに離散値が渡された場合は角度が等間隔に割り当てられます。

下記のコードでは、値にfequency列、角度にdirection列を指定してポーラチャートを描画しています。

また引数colorstrength列を渡して、積み上げで表現しています。

[Google Colaboratory]

1
2
3
4
5
px.bar_polar(wind,              # データセット
r="frequency", # 値
theta="direction", # 角度
color="strength", # strengthで分割して積み上げ
).show()

[実行結果]

Plotly Express⑲(三角図)

三角図は、3変数のデータの関係を正三角形で表現したグラフです。

正三角形の各辺が変数となり、各変数の比率を要素から各辺の垂線の長さで表現しています。

データの読み込み

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

準備するデータは選挙データセット(地域と投票結果)です。

[Google Colaboratory]

1
2
3
4
import plotly.express as px

election = px.data.election()
election.head()

三角図

三角図を表示するには次の関数の引数a,b,cに値となる列名を渡します。

  • scatter_ternary関数
    点で描画を行う。
  • line_ternary関数
    線で描画を行う。

下記のコードでは、Joy列、Coderre列、Begeron列の三角図を描画します。

またwinner列で色分けを行い、total列を要素の大きさで表現しています。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
px.scatter_ternary(election,                # データセット
a="Joly", # 左下から上に表示する列
b="Coderre", # 右下から左下に表示する列
c="Bergeron", # 上から右下に表示する列
color="winner", # 色分けする列
size="total", # 要素の大きさ
size_max=15, # 要素の大きさの最大値
hover_name="district" # ホバーツールのタイトル
).show()

[実行結果]

Plotly Express⑱(平行プロット)

平行プロットは前回記事の平行座標プロットと同じような可視化を行います。

平行座標プロットが連続値を扱うのに対し、平行プロットは離散値を扱います。

データの読み込み

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

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

[Google Colaboratory]

1
2
3
4
import plotly.express as px

tips = px.data.tips()
tips.head()

平行プロット

平行プロットを描画するにはparallel_categories関数を使います。

引数dimensionsには対象となる列を指定します。(省略した場合にはすべての列が描画対象となります)

引数colorに列名を渡すと、その列の値で色分けします。

[Google Colaboratory]

1
2
3
4
5
6
px.parallel_categories(
tips,
dimensions=["sex", "smoker", "time", "day"], # 対象列を指定
color="size", # size列で色分け
color_continuous_scale=px.colors.sequential.Inferno, # カラースケール
).show()

[実行結果]

平行座標プロットと同様に、ドラッグ操作で軸を移動できます。

縦軸内のカテゴリも上下に移動可能です。

横軸のtimeを一番左に移動し、縦軸のLunchを上に移動すると下記のようなグラフになります。

[実行結果(timeを一番左に移動し、Lunchを上に移動)]

Plotly Express⑰(平行座標プロット)

平行座標プロットは変数間の関係を平行に並べて表現します。

各変数を縦軸にとった座標を平行に配置し、要素の座標同士を線分で連結します。

データの関係性を可視化する場合、2変数の場合は散布図が向いていますが、平行座標プロットでは多変数の関係を可視化するのに向いています。

データの読み込み

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

準備するデータはirisデータセット(アヤメの種類と特徴量)です。

[Google Colaboratory]

1
2
3
4
import plotly.express as px

iris = px.data.iris()
iris.head()

平行座標プロット

平行座標プロットを描画するにはparallel_coordinates関数を使います。

引数のdimensionsに対象となる列を指定します。(省略した場合にはすべての列が描画対象となります)

引数のcolorに列名を渡すと、その列の値で色分けします。

[Google Colaboratory]

1
2
3
4
5
px.parallel_coordinates(
iris,
dimensions=["sepal_length", "sepal_width", "petal_length", "petal_width"],
color="species_id", # species_id列をカラースケールで表現
).show()

[実行結果]

上記に表示されている4変数の内、隣り合っていないsepal_lengthpetal_lengthの関係を確認したい場合、petal_lengthを左にドラッグすることで軸の位置を移動することができます。

[実行結果(petal_lengthを1つ左に移動)]