カテゴリー

px

【plotly&scatter_matrix】複数種の軸を持つsubplotをpxで描画

2021年11月7日

こんな人にオススメ

pxscatter_matrixっていう関数があるんだけど、これは一体何?

公式の例だとsubplotみたいに描画されているんだけど。

ということで、今回はplotlypxscatter_matrixについて解説する。scatter_matrixは簡単にいうと複数種類の軸をsubplot(サブプロット)するグラフ。

以下の記事でpxsubplotについて解説したが、このsubplotはある一定の軸を持つグラフをある基準でsunplotするってものだった。以下の記事だと横軸がGDPで縦軸が平均寿命で固定。

【px&facet】plotly.expressでsubplotsを描く

続きを見る

しかし、scatter_matrixの場合だと複数種の軸でグラフを作成できるので、データA x データBのグラフ、データA x データCのグラフといった風に様々な種類のグラフが描ける。

なお、scatter_matrixだとアニメーションもできないのでここは使い勝手が悪め。

【px&animation】plotly.expressでアニメーションのグラフを作成

続きを見る

python環境は以下。

  • Python 3.10.0
  • numpy 1.21.4
  • matplotlib 3.5.0
  • plotly 5.4.0
  • plotly-orca 3.4.2
スポンサーリンク
スポンサーリンク

運営者のメガネです。TwitterInstagramも運営してます。

自己紹介はこちらから、お問い合わせはこちら。

運営者メガネ

作成したコード全文

下準備

import matplotlib.cm as cm
import numpy as np
import plotly
import plotly.io as pio
import plotly.express as px

まずは下準備としてのimport関連。メインはplotlyだけど、plotlyのカラースケールは数が少なくて使い勝手が良くないのでmatplotlibを使用する。npはデータのlogを計算するために使用。

あとはplotly関連。orcaはグラフ保存用。以下の記事で解説。

plotlyでグラフを静止画として保存する際に出るポップアップ
【plotly&orca】plotlyで静止画保存(orca)

続きを見る

グラフを作成するための関数たち

ここでは本記事で使用する関数を定義していく。予め関数を定義しておくことで、メインの処理内容の見通しがよくなったり繰り返し同じ処理をするときの修正が楽になったりする。

今回はグラフ保存用の関数とscatter_matrixをグラフ化するための関数を定義。

【plotly&工夫】楽にグラフを描くためのplotlyの関数化

続きを見る

グラフ保存用の関数

# グラフ保存用の関数
def save(fig, config, save_name):
    pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
    pio.write_html(fig, f"{save_name}.html", config=config,)
    pio.write_image(fig, f"{save_name}.png")

グラフの保存用の関数を定義。保存形式はhtmlとpngにした。html保存の時にconfigを適用することで、保存した後でもconfigの設定を引き継げる。

configはグラフの右上に表示されるツールバーのこと。ここの編集をすることで、余計な機能を省いたり逆に機能を追加したりできる。

scatter_matrixプロット用の関数

# scatter_matrix用の関数
def scatter_matrix(df, save_name,
                   update_traces={}, update_layout={}, **kwargs):
    fig = px.scatter_matrix(df, **kwargs)
    fig.update_traces(**update_traces)  # 追加でfigの修正・設定を行う用
    fig.update_layout(**update_layout)  # 追加でlayoutの修正・設定を行う用

    fig.show()
    prefix = 'px-scattermatrix'
    save(fig=fig, config=None, save_name=f"{prefix}_{save_name}")

メインとなるscatter_matrixプロット用の関数を定義。pxの場合はpandasのデータフレームをベースとしてプロットする。

kwargsは可変長キーワード引数で後から設定を追加したりする際に便利。**は展開って意味だけど、update_layoutupdate_tracesはただのdictを展開しているだけだから注意。まあ設定を追加するって点では同じ意味。

**は1つの関数に1回しか使用できないから仕方なくdictで補っている。kwargsupdate_tracesupdate_layoutも同じイメージ。

【plotly&kwargs】グラフ作成時の設定を後から追加できるように

続きを見る

なお、わざわざ分けているのには理由がある。px.scatter_matrixの引数にあるものはkwargs、ないものはupdate_tracesupdate_layoutで対応する。pxはサクッとグラフを作る事ができるが、引数が少ないのが問題点。

あとはグラフの表示と保存。必要最低限の機能はこの関数で使えるようにしているので、追加でグラフにしたい情報をkwargsなどで実現する。

簡単なデータでscatter_matrix

df = px.data.iris()
print(df)
#      sepal_length  sepal_width  ...    species  species_id
# 0             5.1          3.5  ...     setosa           1
# 1             4.9          3.0  ...     setosa           1
# 2             4.7          3.2  ...     setosa           1
# 3             4.6          3.1  ...     setosa           1
# 4             5.0          3.6  ...     setosa           1
# ..            ...          ...  ...        ...         ...
# 145           6.7          3.0  ...  virginica           3
# 146           6.3          2.5  ...  virginica           3
# 147           6.5          3.0  ...  virginica           3
# 148           6.2          3.4  ...  virginica           3
# 149           5.9          3.0  ...  virginica           3

# [150 rows x 6 columns]

print(df.columns.values)
# ['sepal_length' 'sepal_width' 'petal_length' 'petal_width' 'species'
#  'species_id']

print(df['species'].unique())
# ['setosa' 'versicolor' 'virginica']

print(df['species_id'].unique())
# [1 2 3]

まずはよく公式のグラフ例でよく出てくるirisのデータを使用してグラフを作成してみる。データフレームの中身は上。

公式のグラフでは基本的に3種類のspeciesでデータを分けることが多い。

シンプルにグラフ化

まずはシンプルに定義したscatter_matrix関数でプロット。横軸、縦軸ともに使用したデータフレームの全ヘッダーをマトリックス状に配置してグラフを作成している。

なので、対角線を跨いで対照的な位置にあるグラフは横軸と縦軸が入れ替わったようなグラフとなる。軸の反転。

全ヘッダでグラフを作成するので網羅性はハンパない。ただ、これだと何が何のデータか側わかりにくい。ということで、次で色分けをする。

# シンプルにグラフ化
scatter_matrix(df=df, save_name='iris')

colorで色分け

というわけで色分けをする。ここではspeciesを対象に色分けを行なってみた。こうすると各グラフでspeciesの位置関係がわかりやすい。

しかしspeciesで色分けしているけどspeciesspecies_idという、ここではあまり活用しないだろうヘッダもグラフ化されている。なので次は欲しいデータだけグラフ化する。

# 色分け
scatter_matrix(
    df=df, save_name='iris_color',
    color='species',  # ヘッダ名speciesで色分け
)

dimensionsで欲しいデータだけグラフ化

引数dimensionsでヘッダ名を指定することで、指定したヘッダ名だけでグラフを作成することが可能になる。ここではwidthlengthのデータのみをグラフ化した。

しかし、よくよく考えると左上から右下にかけての対角線のグラフは同じデータなので必ずに直線となる。ここのグラフはいらないので次で削除する。

# グラフ化したいデータだけ使用
scatter_matrix(
    df=df, save_name='iris_species_dimensions',
    color='species',
    # グラフ化したいヘッダ名を指定
    dimensions=['sepal_width', 'sepal_length', 'petal_width', 'petal_length'],
)

fig.update_traceで対角線を削除


残念ながらscatter_matrixだけでは対角線のグラフを削除することはできない。しかし、作成したfigを修正するfig.update_tracesの引数diagonal_visibleで対角線のグラフの表示を変更できるのでここをイジる。

自作のscatter_matrix関数の引数update_tracesdiagonal_visible=Falseを指定し、対角線上のグラフを削除した。

# 対角線のグラフは同じデータなので削除
scatter_matrix(
    df=df, save_name='iris_species_dimensions_diagonal_visible',
    color='species',
    dimensions=['sepal_width', 'sepal_length', 'petal_width', 'petal_length'],
    # 対角線のデータは削除
    update_traces=dict(diagonal_visible=False),
)

データが多いデータフレームでscatter_matrixを作成

df = px.data.gapminder()
print(df)
#           country continent  year  ...   gdpPercap  iso_alpha  iso_num
# 0     Afghanistan      Asia  1952  ...  779.445314        AFG        4
# 1     Afghanistan      Asia  1957  ...  820.853030        AFG        4
# 2     Afghanistan      Asia  1962  ...  853.100710        AFG        4
# 3     Afghanistan      Asia  1967  ...  836.197138        AFG        4
# 4     Afghanistan      Asia  1972  ...  739.981106        AFG        4
# ...           ...       ...   ...  ...         ...        ...      ...
# 1699     Zimbabwe    Africa  1987  ...  706.157306        ZWE      716
# 1700     Zimbabwe    Africa  1992  ...  693.420786        ZWE      716
# 1701     Zimbabwe    Africa  1997  ...  792.449960        ZWE      716
# 1702     Zimbabwe    Africa  2002  ...  672.038623        ZWE      716
# 1703     Zimbabwe    Africa  2007  ...  469.709298        ZWE      716

# [1704 rows x 8 columns]

お次もよく公式のグラフ紹介で出てくるgapminderのデータ。これには以下のデータが入っている。

  1. 国名
  2. 大陸名
  3. 平均寿命
  4. 人口
  5. 1人あたりGDP
  6. ISOでの国名
  7. ISOでの国コード

さっきより格段にデータ量が多くなるが、作成する要領はさっきと同じ。

もちろんシンプルにグラフ化するとごちゃごちゃ

当たり前だけど、シンプルにデータフレームを入れただけだとデータはごちゃごちゃになる。全てが青色で何が何やら。

# そのままだとごちゃごちゃ
scatter_matrix(df=df, save_name='gapminder',)

大陸で色分け

続いては大陸で色分け行ってみた。こうしてみると横軸を平均寿命(lifeExp)、縦軸を人口(pop)にした時ではアジアの人口が多そうに見える。

ただし、ホバーで表示される情報は大陸名と平均寿命と人口なので何年のどの国のデータかがわからない。あと、iso_numもここでは使わないので省略したい。ということで次で色々とカスタムする。

# 大陸ごとに色分け
scatter_matrix(
    df=df, save_name='gapminder_color', color='continent',
    update_traces=dict(diagonal_visible=False),
)

国ごとに色分け+その他の設定

ということでガッツリと修正してみた。具体的には以下。

  1. 色分けを国ごとに変更
  2. 大陸、年、平均寿命、人口、1人あたりGDPでグラフを作成
  3. 色分けをmatplotlibのカラースケールのJetで設定
  4. ホバー時の表示データをデータフレームの全ヘッダ情報に

色分けを国ごとに変更したので凡例がハンパなく多くなる。ということでカラースケールの連続色を使用するわけだが、plotlyのカラースケールだと色が6種類くらいしかないので足りない。

なので、ここではmatplotlib.cmで色を計算で算出しつつ、plotly用に改良した。色については以下。matplotlibでは色は0-1の範囲で作成するが、plotlyでは0-255なので調節が必要。統一してほしかった。

【plotly&色の自動調節】入力したRGBをrgba(R, G, B, a)に自動変換する

続きを見る

# 国ごとに色分けするために国の数だけカラースケールを作成
countries = df['country'].unique()
color = []
for num, _ in enumerate(countries):
    cmap = cm.jet(num / len(countries))
    rgb = f"rgb{plotly.colors.convert_to_RGB_255(cmap)}"
    color.append(rgb)
print(color)
# ['rgb(0, 0, 128)', 'rgb(0, 0, 132)', 'rgb(0, 0, 141)', 'rgb(0, 0, 150)', 'rgb(0, 0, 159)', 'rgb(0, 0, 168)', 'rgb(0, 0, 173)', 'rgb(0, 0, 182)', 'rgb(0, 0, 191)', 'rgb(0, 0, 200)', 'rgb(0, 0, 209)', 'rgb(0, 0, 214)', 'rgb(0, 0, 223)', 'rgb(0, 0, 232)', 'rgb(0, 0, 241)', 'rgb(0, 0, 250)', 'rgb(0, 0, 255)', 'rgb(0, 0, 255)', 'rgb(0, 0, 255)', 'rgb(0, 8, 255)', 'rgb(0, 16, 255)', 'rgb(0, 20, 255)', 'rgb(0, 28, 255)', 'rgb(0, 36, 255)', 'rgb(0, 44, 255)', 'rgb(0, 52, 255)', 'rgb(0, 56, 255)', 'rgb(0, 64, 255)', 'rgb(0, 72, 255)', 'rgb(0, 80, 255)', 'rgb(0, 88, 255)', 'rgb(0, 92, 255)', 'rgb(0, 100, 255)', 'rgb(0, 108, 255)', 'rgb(0, 116, 255)', 'rgb(0, 124, 255)', 'rgb(0, 128, 255)', 'rgb(0, 136, 255)', 'rgb(0, 144, 255)', 'rgb(0, 152, 255)', 'rgb(0, 160, 255)', 'rgb(0, 164, 255)', 'rgb(0, 172, 255)', 'rgb(0, 180, 255)', 'rgb(0, 188, 255)', 'rgb(0, 196, 255)', 'rgb(0, 200, 255)', 'rgb(0, 208, 255)', 'rgb(0, 216, 255)', 'rgb(0, 224, 251)', 'rgb(2, 232, 244)', 'rgb(6, 236, 241)', 'rgb(12, 244, 235)', 'rgb(19, 252, 228)', 'rgb(25, 255, 222)', 'rgb(31, 255, 215)', 'rgb(35, 255, 212)', 'rgb(41, 255, 206)', 'rgb(48, 255, 199)', 'rgb(54, 255, 193)', 'rgb(60, 255, 186)', 'rgb(64, 255, 183)', 'rgb(70, 255, 177)', 'rgb(77, 255, 170)', 'rgb(83, 255, 164)', 'rgb(90, 255, 157)', 'rgb(93, 255, 154)', 'rgb(99, 255, 148)', 'rgb(106, 255, 141)', 'rgb(112, 255, 135)', 'rgb(119, 255, 128)', 'rgb(125, 255, 122)', 'rgb(128, 255, 119)', 'rgb(135, 255, 112)', 'rgb(141, 255, 106)', 'rgb(148, 255, 99)', 'rgb(154, 255, 93)', 'rgb(157, 255, 90)', 'rgb(164, 255, 83)', 'rgb(170, 255, 77)', 'rgb(177, 255, 70)', 'rgb(183, 255, 64)', 'rgb(186, 255, 60)', 'rgb(193, 255, 54)', 'rgb(199, 255, 48)', 'rgb(206, 255, 41)', 'rgb(212, 255, 35)', 'rgb(215, 255, 31)', 'rgb(222, 255, 25)', 'rgb(228, 255, 19)', 'rgb(235, 255, 12)', 'rgb(241, 252, 6)', 'rgb(244, 248, 2)', 'rgb(251, 241, 0)', 'rgb(255, 234, 0)', 'rgb(255, 226, 0)', 'rgb(255, 219, 0)', 'rgb(255, 215, 0)', 'rgb(255, 208, 0)', 'rgb(255, 200, 0)', 'rgb(255, 193, 0)', 'rgb(255, 185, 0)', 'rgb(255, 182, 0)', 'rgb(255, 174, 0)', 'rgb(255, 167, 0)', 'rgb(255, 159, 0)', 'rgb(255, 152, 0)', 'rgb(255, 148, 0)', 'rgb(255, 141, 0)', 'rgb(255, 134, 0)', 'rgb(255, 126, 0)', 'rgb(255, 119, 0)', 'rgb(255, 115, 0)', 'rgb(255, 108, 0)', 'rgb(255, 100, 0)', 'rgb(255, 93, 0)', 'rgb(255, 85, 0)', 'rgb(255, 82, 0)', 'rgb(255, 74, 0)', 'rgb(255, 67, 0)', 'rgb(255, 59, 0)', 'rgb(255, 52, 0)', 'rgb(255, 48, 0)', 'rgb(255, 41, 0)', 'rgb(255, 34, 0)', 'rgb(255, 26, 0)', 'rgb(255, 19, 0)', 'rgb(250, 15, 0)', 'rgb(241, 8, 0)', 'rgb(232, 0, 0)', 'rgb(223, 0, 0)', 'rgb(214, 0, 0)', 'rgb(209, 0, 0)', 'rgb(200, 0, 0)', 'rgb(191, 0, 0)', 'rgb(182, 0, 0)', 'rgb(173, 0, 0)', 'rgb(168, 0, 0)', 'rgb(159, 0, 0)', 'rgb(150, 0, 0)', 'rgb(141, 0, 0)', 'rgb(132, 0, 0)']

あとはscatter_matrixに必要な引数を設定すればいい。色はcolor_discrete_sequenceで、ホバーはhover_dataで指定する。

ある程度見やすくはなってきたが、人口やGDPの部分で極端に高い値を拾っているのでその他がのっぺりして判別がつきにくい。ということで、ここのデータのlogをとって値の差を小さくする。

scatter_matrix(
    df=df, save_name='gapminder_color_discrete_sequence', color='country',
    dimensions=['continent', 'year', 'lifeExp', 'pop', 'gdpPercap'],
    color_discrete_sequence=color,  # 色分けの指定
    hover_data=df,  # ホバーで表示する内容はdfの内容全部とする
    update_traces=dict(diagonal_visible=False),
)

人口とGDPの値のlogをとって見やすく


ということで、人口とGDPのデータのlogをとるわけだが、とりあえず現状のデータフレームは以下。

df = px.data.gapminder()
print(df)
#           country continent  year  ...   gdpPercap  iso_alpha  iso_num
# 0     Afghanistan      Asia  1952  ...  779.445314        AFG        4
# 1     Afghanistan      Asia  1957  ...  820.853030        AFG        4
# 2     Afghanistan      Asia  1962  ...  853.100710        AFG        4
# 3     Afghanistan      Asia  1967  ...  836.197138        AFG        4
# 4     Afghanistan      Asia  1972  ...  739.981106        AFG        4
# ...           ...       ...   ...  ...         ...        ...      ...
# 1699     Zimbabwe    Africa  1987  ...  706.157306        ZWE      716
# 1700     Zimbabwe    Africa  1992  ...  693.420786        ZWE      716
# 1701     Zimbabwe    Africa  1997  ...  792.449960        ZWE      716
# 1702     Zimbabwe    Africa  2002  ...  672.038623        ZWE      716
# 1703     Zimbabwe    Africa  2007  ...  469.709298        ZWE      716

# [1704 rows x 8 columns]

logをとるのは簡単で、numpynp.log10で底10のlogをとることができる。大体のデータは底10を使用するのが一般的、な気がする。

あとはこのlogを撮ったデータをデータフレームに追加したらいい。追加はシンプルにヘッダ名とそのデータを使えばいい。logを使ったデータ2列分を追加したので合計10列となった。

# 人口と1人あたりGDPの値にlogでとる
df['log_pop'] = np.log10(df['pop'])
df['log_gdpPercap'] = np.log10(df['gdpPercap'])

print(df)
#           country continent  year  ...  iso_num   log_pop  log_gdpPercap
# 0     Afghanistan      Asia  1952  ...        4  6.925587       2.891786
# 1     Afghanistan      Asia  1957  ...        4  6.965716       2.914265
# 2     Afghanistan      Asia  1962  ...        4  7.011447       2.931000
# 3     Afghanistan      Asia  1967  ...        4  7.062129       2.922309
# 4     Afghanistan      Asia  1972  ...        4  7.116590       2.869221
# ...           ...       ...   ...  ...      ...       ...            ...
# 1699     Zimbabwe    Africa  1987  ...      716  6.964562       2.848901
# 1700     Zimbabwe    Africa  1992  ...      716  7.029560       2.840997
# 1701     Zimbabwe    Africa  1997  ...      716  7.057093       2.898972
# 1702     Zimbabwe    Africa  2002  ...      716  7.076515       2.827394
# 1703     Zimbabwe    Africa  2007  ...      716  7.090298       2.671829

# [1704 rows x 10 columns]

最後にpopの代わりにlog_popを、gdpPercapの代わりにlog_gdpPercapdimensionsで指定してグラフを作成したらおしまい。

データ同士が広がって違いがわかりやすいようになった。これだと極端な値を持つデータに引っ張られることなくデータを見ることが出来る。

んだけど、このグラフでは全ての年のデータが1つにまとめられている。なのである年のデータだけ抽出したいんだけど、その有効的な手段であるアニメーションにscatter_matrixは非対応。

なので、最後に単年のデータフレームを抽出して、その年でグラフを作成する方向にシフトする。

scatter_matrix(
    df=df, save_name='gapminder_logscale', color='country',
    dimensions=['continent', 'year', 'lifeExp', 'log_pop', 'log_gdpPercap', ],
    color_discrete_sequence=color,
    hover_data=df,
    update_traces=dict(
        diagonal_visible=False,
        # マーカーのサイズを小さめに
        marker_size=3,
    ),
)

gapminderの単年のデータをscatter_matrix

print(df)
#           country continent  year  ...  iso_num   log_pop  log_gdpPercap
# 0     Afghanistan      Asia  1952  ...        4  6.925587       2.891786
# 1     Afghanistan      Asia  1957  ...        4  6.965716       2.914265
# 2     Afghanistan      Asia  1962  ...        4  7.011447       2.931000
# 3     Afghanistan      Asia  1967  ...        4  7.062129       2.922309
# 4     Afghanistan      Asia  1972  ...        4  7.116590       2.869221
# ...           ...       ...   ...  ...      ...       ...            ...
# 1699     Zimbabwe    Africa  1987  ...      716  6.964562       2.848901
# 1700     Zimbabwe    Africa  1992  ...      716  7.029560       2.840997
# 1701     Zimbabwe    Africa  1997  ...      716  7.057093       2.898972
# 1702     Zimbabwe    Africa  2002  ...      716  7.076515       2.827394
# 1703     Zimbabwe    Africa  2007  ...      716  7.090298       2.671829

# [1704 rows x 10 columns]

# 元のデータフレームにある年でフィルターをかける
single_year = {}
for year in df['year'].unique():
    # queryを使用時に変数を使用したいなら@をつける
    single_year[year] = df.query('year == @year')

ということで、単年でグラフを作成する。本当はアニメーションを使って1つのグラフで作成できれば一番いいんだけどできないから仕方ない。

一応、goを使ってアニメーションをくっつけるってこともできないこともないだろうけど、goのアニメーションは面倒なのでスルーする。

単年のデータは年ごとにdictに格納した。中身は以下。

あとはこのdictから好きな年のデータを引っ張ってきてグラフを作成するだけ。ただし、以下に示すように色々とカスタムしておいた。

軸の表示範囲、凡例、高さは自作のscatter_matrix関数の引数layoutsdictを指定することで関数内で展開してくれる。

  1. グラフタイトルを年に
  2. マーカーのサイズは人口に
  3. マーカーの最大サイズは30に
  4. マーカーの形状は大陸ごとに
  5. それぞれの軸の表示範囲を設定
  6. 凡例はグラフの下に横続きで作成
  7. グラフの高さを指定

ただし、軸の表示範囲についてはaxisの番号がdimensionsの順番になっているんだけど、sizelog_popに変更するとaxis1log_popになってaxis2以降がdimensionsの順番に変わるので注意。

axisの値が軸の値に合っていないと初期状態でちゃんと表示されなくなる。ややこしいけど、自分で色々操作してみると実感が湧く。

今回は一番古い1952年と一番新しい2007年のデータでグラフを作成した。プロット点が小さすぎて数が少なく感じるかもしれないけどホバーしたらちゃんとプロットされていることが確認できる。

プロット点についてはマーカーサイズ専用でデータフレームに列を追加してもいいかもしれない。



# レイアウト設定
layouts = {
    'xaxis1': dict(range=(-0.5, 4.5)),  # continentの表示範囲(index扱い)
    'xaxis2': dict(range=(20, 85)),  # lifeExpの表示範囲
    'xaxis3': dict(range=(4, 10)),  # log_popの表示範囲
    'xaxis4': dict(range=(2, 5)),  # log_gdpPercapの表示範囲
    'legend': dict(
        x=0, y=-0.2, xanchor='left', yanchor='top',  # 位置関係
        orientation='h'  # 凡例の表示方向
    ),
    'height': 1000,  # 高さを上げる
}

# グラフ化
years = (1952, 2007)
for year in years:
    scatter_matrix(
        df=single_year[year], save_name=f"gapminder_{year}", color='country',
        dimensions=['continent', 'lifeExp', 'log_pop', 'log_gdpPercap', ],
        color_discrete_sequence=color,
        hover_data=single_year[year],
        update_traces=dict(diagonal_visible=False),
        title=year,  # グラフタイトル
        size='pop', size_max=30,  # マーカーのサイズを人口で分ける
        symbol='continent',  # マーカーの形状を大陸で分ける
        # レイアウトで表示範囲の固定
        update_layout=layouts,
    )

パッと見で欲しいデータが見つかる

今回はpxscatter_matrixを使って複数種の軸を持つsubplotグラフを作成した。シンプルなsubplotでは単一な軸でしか作成できなかったが、scatter_matrixだと複数種類が簡単にできる。

scatter_matrixの大きな特徴は複数種の軸だが、これのおかげでパッと見でどういう傾向があるかを知ることができる。

あとはアニメーションがついてくれたらもっと利便性が上がると思う。また、goでは上半分を非表示にするという引数もあるので、pxでも実装してほしい。

関連記事

【plotly&subplot】goでアニメーションのサブプロット

続きを見る

【px&facet】plotly.expressでsubplotsを描く

続きを見る

【plotly&円グラフ】subplotsやボタンの適用

続きを見る

【plotly&table+scatter】subplotsで表と散布図を同時にグラフ化

続きを見る

【plotly&make_subplots】pythonのplotlyで複数グラフを1つの画像に描く

続きを見る

【plt&subplot】pythonのpltで複数グラフを1つの画像に描く

続きを見る

【plotly&pandas】df.plot()でPlotlyのグラフを作成

続きを見る

関連コンテンツ

スポンサーリンク

Amazonのお買い物で損したない人へ

1回のチャージ金額通常会員プライム会員
¥90,000〜2.0%2.5%
¥40,000〜1.5%2.0%
¥20,000〜1.0%1.5%
¥5,000〜0.5%1.0%

Amazonギフト券にチャージすることでお得にお買い物できる。通常のAmazon会員なら最大2.0%、プライム会員なら2.5%還元なのでバカにならない。

ゲットしたポイントは通常のAmazonでのお買い物に使えるからお得だ。一度チャージしてしまえば、好きなタイミングでお買いものできる。

なお、有効期限は10年だから安心だ。いつでも気軽にAmazonでお買い物できる。

Amazonチャージはここから出来るで

もっとお得なAmazon Prime会員はこちらから

30日間無料登録

執筆者も便利に使わせてもらってる

スポンサーリンク

  • この記事を書いた人

メガネ

独学でpythonを学び天文学系の大学院を修了。 ガジェット好きでMac×Android使い。色んなスマホやイヤホンを購入したいけどお金がなさすぎて困窮中。 元々、人見知りで根暗だったけど、人生楽しもうと思って良い方向に狂ったために今も人生めちゃくちゃ楽しい。 pythonとガジェットをメインにブログを書いていますので、興味を持たれましたらちょこちょこ訪問してくだされば幸いです🥰。 自己紹介→変わって楽しいの繰り返し

-px
-, , ,