カテゴリー

当サイトはアフィリエイトプログラムによる収益を得ています〈景品表示法に基づく表記です)

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

運営者のメガネです。YouTubeTwitterInstagram、自己紹介はこちら、お問い合わせはこちらから。

運営者メガネ

作成したコード全文

下準備

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も同じイメージ。

なお、わざわざ分けているのには理由がある。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のグラフを作成

続きを見る

ガジェット

2023/9/18

【デスクツアー2022下半期】モノは少なく、でも効率的に Desk Updating #0

今回はガジェットブロガーなのにデスク環境を構築していない執筆者の ...

ライフハック

2023/9/16

【Audible vs YouTube Premium】耳で聴く音声学習コンテンツを比較

ワイヤレスイヤホンが普及し耳で学習することへのハードルが格段に下 ...

完全ワイヤレスイヤホン(TWS)

2023/9/18

【SENNHEISER MOMENTUM True Wireless 3レビュー】全てが整ったイヤホン

今回は高音質・高機能なSENNHEISERのフラグシップ完全ワイヤレスイヤホン「SENNH ...

ライフハック

2023/3/11

【YouTube Premiumとは】メリットしかないから全員入れ

今回はYouTube Premiumを実際に使ってみてどうなのか、どんなメリット/デメリット ...

マウス

2023/8/17

【Logicool MX ERGOレビュー】疲れない作業効率重視トラックボールマウス

こんな人におすすめ トラックボールマウスの王道Logicool MX ERGOが気になるけどऩ ...

ベストバイ

2023/9/18

【ベストバイ2022】今年買って良かったモノのトップ10

2022年ベストバイ この1年を振り返って執筆者は何を買ったのか。ガジェッ& ...

スマホ

2023/1/15

【楽天モバイル×povo2.0の併用】月1,000円の保険付きデュアルSIM運用

こんな人におすすめ 楽天モバイルとpovo2.0のデュアルSIM運用って実際のとこ ...

マウス

2023/9/16

【Logicool MX ERGO vs MX Master 3】ERGOをメインにした決定的な理由

こんな疑問・お悩みを持っている人におすすめ 執筆者はLogicoolのハイエンӠ ...

macOSアプリケーション

2022/9/30

【Chrome拡張機能】便利で効率的に作業できるおすすめの拡張機能を18個紹介する

こんな人におすすめ Chromeの拡張機能を入れたいけど、調べても同じような ...

macOSアプリケーション

2023/5/3

【Automator活用術】Macで生産性を上げる作業の自動化術

今回はMacに標準でインストールされているアプリ「Automator」を使ってできる ...

Pythonを学びたいけど独学できる時間なんてない人へのすゝめ

執筆者は大学の研究室・大学院にて独学でPythonを習得した。

でも社会人になったら独学で行うには時間も体力もなくて大変だ。

時間がない社会人だからこそプロの教えを乞うのが効率的。

ここでは色んなタイプに合ったプログラミングスクールの紹介をする。

  • この記事を書いた人

メガネ

Webエンジニア駆け出し。独学のPythonで天文学系の大学院を修了。常時金欠のガジェット好きでM2 Pro MacBook Pro(30万円) x Galaxy S22 Ultra(17万円)使いの狂人。自己紹介と半生→変わって楽しいの繰り返しレビュー依頼など→お問い合わせ運営者情報、TwitterX@m_ten_pa、 YouTube@megatenpa、 Threads@megatenpa

-px
-, , ,