カテゴリー

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

go

【plotly&バブルチャート】plotlyで各国の収入と平均寿命をバブルチャートで描く

2021年4月25日

bubblechart2017_pop

こんな人にオススメ


plotlyを使ってバブルチャートを作成してみたい!でもでもどんな風に作ったらいいの?特にバブルの大きさってどうなってるの?教えて!

ということで、今回はplotlyを用いてバブルチャートを作成してみた。これまで紹介したグラフは執筆者が今までの研究業務で得た知識だったが、今回は初めての作成ということで勉強も兼ねてこの記事を書く。が、実際に調べてみると結構簡単に完成したので、あまり勉強した感覚はない。まあ新しい知識を身につけたからいいだろう。

python環境は以下。

  • Python 3.9.4
  • numpy 1.20.3
  • matplotlib 3.4.2
  • plotly 4.14.3
  • plotly-orca 3.4.2
  • pandas 1.2.4

運営者のメガネです。YouTubeTwitterInstagramも運営中。自己紹介お問い合わせページあります。

運営者メガネ

使用するデータと完成グラフイメージ

使用するデータ

今回使用するデータは以下の3種類。

  1. 世界各国の収入
  2. 世界各国の平均寿命
  3. 世界各国の人口

データは全て「Gapminder」からの引用で、基本的にこの組織からのデータだが一部のデータは使用していない。「Based on free material from GAPMINDER.ORG, CC-BY LICENSE」、すなわちフリーな素材ということだ。

このデータを知ったきっかけは、「FACTFULNESS」という本を読んだから。この本は執筆者が人生で一番読んで良かったと思っている本で、データや事実に基づきテレビなどでは知り得ない世界の本当の姿を知るという本だ。この本の著者がデータ引用元のギャップマインダー財団の共同創立者。

各データはGapminderの「Download the data」からダウンロードすることができる。収入、平均寿命、人口はそれぞれ以下の定義だ。

  • 収入: 一人当たりGDPでその単位は「2011年の固定価格のinternational dollars」
  • 平均寿命: 現在の死亡パターンが同じままである場合、新生児が生きる平均年数
  • 人口: 単純にその国の総人口

完成グラフイメージ

bubblechart2017_alphabet

bubblechart2017_pop

グラフの最終完成イメージは以下の通り。

  • 横軸: 各国の収入
  • 縦軸: 各国の平均寿命
  • バブルの大きさ: 各国の人口

今回は人口が多いほど赤系統のバブルに、少ないほど青系統のバブルになるように作成した。細かいことは後に解説する。

なお、「https://tools-legacy.gapminder.org/tools/#$state$marker$axis_y$domainMin:null&domainMax:null&zoomedMin:null&zoomedMax:null&spaceRef:null;;;&chart-type=bubbles」にギャップマインダーのグラフがある。クオリティはめちゃくちゃ高い。

グラフ作成全体コード

まずはバブルチャートの作成イメージを書く。特別な関数などは使わなくて、基本的にはplotlygo.Scattermode'markers'に設定。その後、マーカーの大きさを変更する、ただそれだけ。

go.Bubbleなどの新規関数がないようだ。あると思って調べていたが、あっさり完成する。以下に具体的な設定を書く。

  • mode='markers': プロットはマーカーのみ
  • marker=dict(size=(人口の多さで設定)): 人口の多さに応じてマーカーのサイズを大きくする
  • marker=dict(line=dict(color='black', width=1)): マーカーの境目は黒にして、他のデータと混ざらないように設定

全体コードは以下の通り。

以下よりそれぞれの項目について解説していく。

データ作成コードの解説

まずは使用するデータの解説から始める。

下準備

まずは必要なライブラリのimportやテンプレートの読み込み。テンプレートに関しては以下の記事参照。

【随時更新 備忘録】plotlyのグラフ即席作成コード

続きを見る

import sys
import numpy as np
import matplotlib.cm as cm
import plotly
import plotly.graph_objects as go
import plotly.io as pio
import pandas as pd

sys.path.append('../../')
import plotly_layout_template as template

使用するデータの読み込み

今回使用するデータは全てcsv形式でpyファイルと同じディレクトリに入れている。ファイルの読み込みはpandasを使用し、0列目の国名をインデックスにしてヘッダーを年にした。

# 使用するファイル名
# <https://www.gapminder.org/data/> より引用
income_name = './income_per_person_gdppercapita_ppp_inflation_adjusted.csv'
life_expectancy_name = './life_expectancy_years.csv'
population_name = './population_total.csv'

# ファイルを読み込み
income = pd.read_csv(income_name, sep=',', index_col=0)
life_expectancy = pd.read_csv(life_expectancy_name, sep=',', index_col=0)
population = pd.read_csv(population_name, sep=',', index_col=0)

incomeは以下のようなDataFrameになっている。

print(income)
#              1800  1801  1802  1803  1804  ...   2036   2037   2038   2039   2040
# country                                    ...
# Afghanistan   603   603   603   603   603  ...   2820   2880   2940   3000   3060
# Albania       667   667   667   667   667  ...  21500  21900  22300  22800  23300
# Algeria       715   716   717   718   719  ...  15800  16100  16500  16800  17100
# Andorra      1200  1200  1200  1200  1210  ...  81500  83100  84800  86500  88300
# Angola        618   620   623   626   628  ...   6750   6880   7020   7170   7310
# ...           ...   ...   ...   ...   ...  ...    ...    ...    ...    ...    ...
# Venezuela    1210  1200  1200  1190  1190  ...   9110   9300   9490   9680   9880
# Vietnam       778   778   778   778   778  ...  13300  13500  13800  14100  14400
# Yemen         877   879   882   884   887  ...   3570   3640   3720   3790   3870
# Zambia        663   665   667   668   670  ...   3860   3930   4010   4100   4180
# Zimbabwe      869   870   871   872   873  ...   2900   2960   3020   3080   3140

# [193 rows x 241 columns]

life_expectancyは以下。

print(life_expectancy)
#              1800  1801  1802  1803  1804  ...  2096  2097  2098  2099  2100
# country                                    ...
# Afghanistan  28.2  28.2  28.2  28.2  28.2  ...  77.1  77.3  77.4  77.5  77.7
# Albania      35.4  35.4  35.4  35.4  35.4  ...  87.9  88.0  88.1  88.2  88.3
# Algeria      28.8  28.8  28.8  28.8  28.8  ...  88.8  88.9  89.0  89.1  89.2
# Andorra       NaN   NaN   NaN   NaN   NaN  ...   NaN   NaN   NaN   NaN   NaN
# Angola       27.0  27.0  27.0  27.0  27.0  ...  79.4  79.5  79.7  79.8  79.9
# ...           ...   ...   ...   ...   ...  ...   ...   ...   ...   ...   ...
# Venezuela    32.2  32.2  32.2  32.2  32.2  ...  86.9  87.0  87.1  87.2  87.3
# Vietnam      32.0  32.0  32.0  32.0  32.0  ...  84.8  84.9  85.0  85.2  85.3
# Yemen        23.4  23.4  23.4  23.4  23.4  ...  77.9  78.0  78.2  78.3  78.4
# Zambia       32.6  32.6  32.6  32.6  32.6  ...  77.6  77.7  77.8  78.0  78.1
# Zimbabwe     33.7  33.7  33.7  33.7  33.7  ...  75.1  75.3  75.4  75.5  75.7

# [187 rows x 301 columns]

populationは以下のDataFrameとして作成した。

print(population)
#                 1800     1801     1802  ...       2098       2099       2100
# country                                 ...
# Afghanistan  3280000  3280000  3280000  ...   75400000   75200000   74900000
# Albania       400000   402000   404000  ...    1140000    1110000    1090000
# Algeria      2500000  2510000  2520000  ...   70700000   70700000   70700000
# Andorra         2650     2650     2650  ...      62500      62500      62400
# Angola       1570000  1570000  1570000  ...  184000000  186000000  188000000
# ...              ...      ...      ...  ...        ...        ...        ...
# Venezuela    1000000   978000   957000  ...   34500000   34400000   34200000
# Vietnam      4000000  4100000  4200000  ...   98100000   97800000   97400000
# Yemen        2590000  2590000  2590000  ...   53500000   53400000   53200000
# Zambia        747000   758000   770000  ...   80000000   80800000   81500000
# Zimbabwe     1090000  1090000  1090000  ...   31000000   31000000   31000000

# [195 rows x 301 columns]

国名の抽出

上のDataFrameを見ると分かるように、ヘッダの数や行数が異なっている。ヘッダについては2040年までか2100年までかで数が違うが、行数については一部のデータには存在しない国名もある。ここでは収入、平均寿命、人口の3種類のデータが揃っている国に絞ってグラフを作成したいので、国名を抽出した。

なお、今回はデータが途切れてない感じだった2017年のデータのみを使用するので240列や300列もいらない。

# 国名を抽出
income_country = set(income.index.values)
life_expectancy_country = set(life_expectancy.index.values)
population_country = set(population.index.values)

# 共通する国名だけ抽出
# 例えばincomeには「Monaco」があるが、life_expectancyにはないので全てにあるものだけ抽出
common_country = income_country & life_expectancy_country & population_country
common_country = sorted(list(common_country))

共通する国名として設定した変数common_countryは以下のようになっている。

print(common_country)
# ['Afghanistan', 'Albania', 'Algeria', 'Andorra', 'Angola', 'Antigua and Barbuda', 'Argentina', 'Armenia', 'Australia', 'Austria', 'Azerbaijan', 'Bahamas', 'Bahrain', 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', 'Bhutan', 'Bolivia', 'Bosnia and Herzegovina', 'Botswana', 'Brazil', 'Brunei', 'Bulgaria', 'Burkina Faso', 'Burundi', 'Cambodia', 'Cameroon', 'Canada', 'Cape Verde', 'Central African Republic', 'Chad', 'Chile', 'China', 'Colombia', 'Comoros', 'Congo, Dem. Rep.', 'Congo, Rep.', 'Costa Rica', "Cote d'Ivoire", 'Croatia', 'Cuba', 'Cyprus', 'Czech Republic', 'Denmark', 'Djibouti', 'Dominica', 'Dominican Republic', 'Ecuador', 'Egypt', 'El Salvador', 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Eswatini', 'Ethiopia', 'Fiji', 'Finland', 'France', 'Gabon', 'Gambia', 'Georgia', 'Germany', 'Ghana', 'Greece', 'Grenada', 'Guatemala', 'Guinea', 'Guinea-Bissau', 'Guyana', 'Haiti', 'Honduras', 'Hungary', 'Iceland', 'India', 'Indonesia', 'Iran', 'Iraq', 'Ireland', 'Israel', 'Italy', 'Jamaica', 'Japan', 'Jordan', 'Kazakhstan', 'Kenya', 'Kiribati', 'Kuwait', 'Kyrgyz Republic', 'Lao', 'Latvia', 'Lebanon', 'Lesotho', 'Liberia', 'Libya', 'Lithuania', 'Luxembourg', 'Madagascar', 'Malawi', 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Mauritania', 'Mauritius', 'Mexico', 'Micronesia, Fed. Sts.', 'Moldova', 'Mongolia', 'Montenegro', 'Morocco', 'Mozambique', 'Myanmar', 'Namibia', 'Nepal', 'Netherlands', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria', 'North Korea', 'North Macedonia', 'Norway', 'Oman', 'Pakistan', 'Palestine', 'Panama', 'Papua New Guinea', 'Paraguay', 'Peru', 'Philippines', 'Poland', 'Portugal', 'Qatar', 'Romania', 'Russia', 'Rwanda', 'Samoa', 'Sao Tome and Principe', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone', 'Singapore', 'Slovak Republic', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa', 'South Korea', 'South Sudan', 'Spain', 'Sri Lanka', 'St. Lucia', 'St. Vincent and the Grenadines', 'Sudan', 'Suriname', 'Sweden', 'Switzerland', 'Syria', 'Tajikistan', 'Tanzania', 'Thailand', 'Timor-Leste', 'Togo', 'Tonga', 'Trinidad and Tobago', 'Tunisia', 'Turkey', 'Turkmenistan', 'Uganda', 'Ukraine', 'United Arab Emirates', 'United Kingdom', 'United States', 'Uruguay', 'Uzbekistan', 'Vanuatu', 'Venezuela', 'Vietnam', 'Yemen', 'Zambia', 'Zimbabwe']

2017年のデータのみを抽出

今度は数ある年のデータから2017年のものだけを抽出する。ヘッダが年に対応するので単純にDataFrameでヘッダ指定すれば良い。

# 2017年時点のデータを使用
income2017 = income['2017']
life_expectancy2017 = life_expectancy['2017']
population2017 = population['2017']

print(income2017)
# country
# Afghanistan     1760
# Albania        11800
# Algeria        13900
# Andorra        49800
# Angola          6050
#                ...
# Venezuela      14500
# Vietnam         6230
# Yemen           2400
# Zambia          3720
# Zimbabwe        2570
# Name: 2017, Length: 193, dtype: int64

抽出した2017年のデータをdictに入れる

抽出した2017年のデータを収入、平均寿命、人口のkeysに分け、それぞれのkeysに各国のデータを入れる。

data2017 = {}
data2017['income'] = {}
data2017['life_expectancy'] = {}
data2017['population'] = {}
for name in common_country:
    data2017['income'][name] = income2017[name]
    data2017['life_expectancy'][name] = life_expectancy2017[name]
    data2017['population'][name] = population2017[name]

例えば平均寿命なら以下のような結果になる。

print(data2017['life_expectancy'])
# {'Afghanistan': 63.4, 'Albania': 78.2, 'Algeria': 77.7, 'Andorra': 82.7, 'Angola': 64.2, 'Antigua and Barbuda': 77.0, 'Argentina': 76.7, 'Armenia': 75.6, 'Australia': 82.4, 'Austria': 81.8, 'Azerbaijan': 70.8, 'Bahamas': 73.7, 'Bahrain': 79.5, 'Bangladesh': 73.1, 'Barbados': 77.1, 'Belarus': 74.0, 'Belgium': 81.4, 'Belize': 74.2, 'Benin': 64.6, 'Bhutan': 74.0, 'Bolivia': 72.8, 'Bosnia and Herzegovina': 76.7, 'Botswana': 69.1, 'Brazil': 75.5, 'Brunei': 75.3, 'Bulgaria': 74.9, 'Burkina Faso': 61.7, 'Burundi': 61.5, 'Cambodia': 69.9, 'Cameroon': 63.0, 'Canada': 82.0, 'Cape Verde': 75.8, 'Central African Republic': 51.9, 'Chad': 60.0, 'Chile': 79.7, 'China': 77.1, 'Colombia': 80.1, 'Comoros': 68.6, 'Congo, Dem. Rep.': 62.4, 'Congo, Rep.': 62.6, 'Costa Rica': 79.5, "Cote d'Ivoire": 62.5, 'Croatia': 78.5, 'Cuba': 78.4, 'Cyprus': 81.7, 'Czech Republic': 79.2, 'Denmark': 80.8, 'Djibouti': 67.3, 'Dominica': 72.8, 'Dominican Republic': 73.1, 'Ecuador': 76.7, 'Egypt': 70.6, 'El Salvador': 74.0, 'Equatorial Guinea': 65.5, 'Eritrea': 62.7, 'Estonia': 78.1, 'Eswatini': 59.9, 'Ethiopia': 68.4, 'Fiji': 68.1, 'Finland': 81.4, 'France': 82.8, 'Gabon': 68.4, 'Gambia': 65.8, 'Georgia': 72.8, 'Germany': 80.6, 'Ghana': 65.5, 'Greece': 81.0, 'Grenada': 74.1, 'Guatemala': 72.6, 'Guinea': 60.7, 'Guinea-Bissau': 60.0, 'Guyana': 69.2, 'Haiti': 65.0, 'Honduras': 74.0, 'Hungary': 76.8, 'Iceland': 82.8, 'India': 69.0, 'Indonesia': 71.5, 'Iran': 77.3, 'Iraq': 76.7, 'Ireland': 81.8, 'Israel': 83.0, 'Italy': 83.2, 'Jamaica': 74.7, 'Japan': 84.2, 'Jordan': 79.3, 'Kazakhstan': 72.0, 'Kenya': 65.9, 'Kiribati': 62.4, 'Kuwait': 83.1, 'Kyrgyz Republic': 72.7, 'Lao': 67.6, 'Latvia': 75.2, 'Lebanon': 78.0, 'Lesotho': 54.7, 'Liberia': 64.4, 'Libya': 73.0, 'Lithuania': 75.0, 'Luxembourg': 81.7, 'Madagascar': 63.5, 'Malawi': 63.2, 'Malaysia': 74.7, 'Maldives': 81.5, 'Mali': 62.0, 'Malta': 81.0, 'Marshall Islands': 64.5, 'Mauritania': 70.5, 'Mauritius': 74.8, 'Mexico': 75.5, 'Micronesia, Fed. Sts.': 67.2, 'Moldova': 72.9, 'Mongolia': 68.9, 'Montenegro': 76.5, 'Morocco': 74.0, 'Mozambique': 58.4, 'Myanmar': 68.5, 'Namibia': 66.5, 'Nepal': 70.9, 'Netherlands': 81.5, 'New Zealand': 81.6, 'Nicaragua': 78.8, 'Niger': 62.4, 'Nigeria': 64.3, 'North Korea': 72.0, 'North Macedonia': 76.5, 'Norway': 82.3, 'Oman': 77.1, 'Pakistan': 66.8, 'Palestine': 76.8, 'Panama': 79.3, 'Papua New Guinea': 58.5, 'Paraguay': 76.1, 'Peru': 80.3, 'Philippines': 69.7, 'Poland': 78.0, 'Portugal': 81.4, 'Qatar': 80.2, 'Romania': 75.2, 'Russia': 72.1, 'Rwanda': 68.5, 'Samoa': 72.9, 'Sao Tome and Principe': 66.9, 'Saudi Arabia': 76.9, 'Senegal': 68.0, 'Serbia': 75.7, 'Seychelles': 73.6, 'Sierra Leone': 60.4, 'Singapore': 84.8, 'Slovak Republic': 77.4, 'Slovenia': 81.1, 'Solomon Islands': 68.5, 'Somalia': 58.5, 'South Africa': 66.3, 'South Korea': 82.6, 'South Sudan': 59.3, 'Spain': 83.1, 'Sri Lanka': 77.5, 'St. Lucia': 75.5, 'St. Vincent and the Grenadines': 72.3, 'Sudan': 70.3, 'Suriname': 72.0, 'Sweden': 82.5, 'Switzerland': 84.0, 'Syria': 69.8, 'Tajikistan': 70.3, 'Tanzania': 66.7, 'Thailand': 78.1, 'Timor-Leste': 70.8, 'Togo': 64.4, 'Tonga': 71.8, 'Trinidad and Tobago': 74.2, 'Tunisia': 78.3, 'Turkey': 78.9, 'Turkmenistan': 70.1, 'Uganda': 65.7, 'Ukraine': 70.5, 'United Arab Emirates': 73.3, 'United Kingdom': 81.0, 'United States': 78.6, 'Uruguay': 77.0, 'Uzbekistan': 70.3, 'Vanuatu': 64.7, 'Venezuela': 75.3, 'Vietnam': 74.5, 'Yemen': 68.1, 'Zambia': 63.2, 'Zimbabwe': 61.4}

人口が多い順番に国を並び替え

上で作成したデータは国名をアルファベット順に並べて表示したものだ。これに加えて人口が多い順番の国名listも作成する。これについては次に説明する。

# 人口が多い順に並び替え
pop = data2017['population']
sorted_pop = list(dict(sorted(pop.items(), key=lambda x: x[1], reverse=True)))

print(sorted_pop)
# ['China', 'India', 'United States', 'Indonesia', 'Brazil', 'Pakistan', 'Nigeria', 'Bangladesh', 'Russia', 'Japan', 'Mexico', 'Ethiopia', 'Philippines', 'Egypt', 'Vietnam', 'Germany', 'Congo, Dem. Rep.', 'Turkey', 'Iran', 'Thailand', 'United Kingdom', 'France', 'Italy', 'South Africa', 'Tanzania', 'Myanmar', 'South Korea', 'Kenya', 'Colombia', 'Spain', 'Ukraine', 'Argentina', 'Algeria', 'Uganda', 'Sudan', 'Poland', 'Iraq', 'Canada', 'Afghanistan', 'Morocco', 'Saudi Arabia', 'Uzbekistan', 'Peru', 'Malaysia', 'Angola', 'Venezuela', 'Ghana', 'Mozambique', 'Yemen', 'Nepal', 'Madagascar', 'North Korea', 'Australia', 'Cameroon', "Cote d'Ivoire", 'Niger', 'Sri Lanka', 'Romania', 'Burkina Faso', 'Chile', 'Mali', 'Kazakhstan', 'Malawi', 'Syria', 'Netherlands', 'Guatemala', 'Zambia', 'Ecuador', 'Cambodia', 'Senegal', 'Chad', 'Somalia', 'Zimbabwe', 'Guinea', 'Rwanda', 'Belgium', 'Tunisia', 'Cuba', 'Benin', 'Bolivia', 'Haiti', 'South Sudan', 'Burundi', 'Czech Republic', 'Greece', 'Dominican Republic', 'Portugal', 'Sweden', 'Azerbaijan', 'Jordan', 'Hungary', 'United Arab Emirates', 'Belarus', 'Honduras', 'Tajikistan', 'Serbia', 'Austria', 'Switzerland', 'Papua New Guinea', 'Israel', 'Togo', 'Sierra Leone', 'Bulgaria', 'Lao', 'Paraguay', 'Lebanon', 'Libya', 'El Salvador', 'Nicaragua', 'Kyrgyz Republic', 'Turkmenistan', 'Denmark', 'Singapore', 'Finland', 'Slovak Republic', 'Norway', 'Congo, Rep.', 'Costa Rica', 'Ireland', 'Palestine', 'Liberia', 'New Zealand', 'Oman', 'Central African Republic', 'Mauritania', 'Croatia', 'Panama', 'Kuwait', 'Moldova', 'Georgia', 'Uruguay', 'Eritrea', 'Bosnia and Herzegovina', 'Mongolia', 'Armenia', 'Jamaica', 'Albania', 'Lithuania', 'Qatar', 'Namibia', 'Botswana', 'Gambia', 'Lesotho', 'North Macedonia', 'Slovenia', 'Gabon', 'Latvia', 'Guinea-Bissau', 'Bahrain', 'Trinidad and Tobago', 'Estonia', 'Equatorial Guinea', 'Mauritius', 'Timor-Leste', 'Cyprus', 'Eswatini', 'Djibouti', 'Fiji', 'Comoros', 'Guyana', 'Bhutan', 'Solomon Islands', 'Montenegro', 'Luxembourg', 'Suriname', 'Cape Verde', 'Maldives', 'Malta', 'Brunei', 'Bahamas', 'Belize', 'Iceland', 'Barbados', 'Vanuatu', 'Sao Tome and Principe', 'Samoa', 'St. Lucia', 'Kiribati', 'Grenada', 'Micronesia, Fed. Sts.', 'St. Vincent and the Grenadines', 'Tonga', 'Seychelles', 'Antigua and Barbuda', 'Andorra', 'Dominica', 'Marshall Islands']

グラフ化コードの解説

最後にデータの内、横軸を収入、縦軸を平均寿命、バブルの大きさを人口にしたグラフを作成。

この時、国名をアルファベット順にプロットする条件と人口順にプロットする条件の2種類に対応できるように、defの引数にruleを設定した。これは、バブルが大きなものから描いていかないと、バブルの小さなプロットが大きなバブルに埋もれてしまうから。プロットのオーダーだけの変更はできないっぽい。

また、それぞれのruleで保存名を指定するためのsave_nameも設定した。


マーカーのサイズは人口に応じて変化させるのだが、そのままの値だと円が大きくなりすぎるので平方根をとって、さらに100で割ることでちょうど良い大きさに変更した。
marker=dict(
    symbol='circle', color=f"rgba{rgba}",
    # マーカーのサイズ調整
    size=np.sqrt(pop[name]) / 1e2,
    line=dict(color='black', width=1),
),

バブルにカーソルを持っていったときにx, y軸に垂直な線を引いて多少なりともグラフをわかりやすくするために、軸にspikeシリーズの設定を施した。

xaxis=dict(
    title='income [GDP per capita, constant PPP dollars]',
    type='log',
    range=[np.log10(500), np.log10(2e5)],
    showspikes=True,  # x, y軸に垂直な線を引く=spike
    spikecolor='black',  # spikeの線の色
    spikethickness=2,  # spikeの線の太さ
    spikedash='dot',  # spikeの線種
),
yaxis=dict(
    title='Life expectancy at birth',
    range=[0, 100],
    showspikes=True,
    spikecolor='black',
    spikethickness=2,
    spikedash='dot',
),

凡例はグラフ右にはみ出てもらって、さらに凡例のタイトルを設定した。

legend=dict(
    title=f"country: {save_name}",
    xanchor='left',
),

実際のグラフ

以上を踏まえて作成したグラフのHTMLが以下だ。上が国名がアルファベット、下が人口順にしたものだ。plotlyではプロットの重なりをそのままにして凡例だけ入れ替えることができないのでアルファベット順の凡例に対して人口が多い順にプロットすることができないようだ。
なお、記事に載せる際に上記のコードのままだとバブルが大きすぎたので、以下のHTMLではその大きさを1/4にしている。



世界の実情を自分で見る

今回は世界の人口、平均寿命、収入のデータから実際にバブルチャートを作成した。このように自分でデータを取ってきて世界がどうなっているのかについて知ることが、変な道に大きく外れることを避ける一つの手なのではないだろうかと思う。

今回のグラフから、収入が多ければ平均寿命が伸びる傾向が伺える。そんな気がするような...と思うだけではなく、しっかりとデータを見て事実を知るのが大切だと思う。

関連記事

【随時更新 備忘録】plotlyのグラフ即席作成コード

続きを見る

【plotly&バブルチャート】plotlyで各国の収入と平均寿命の時代変化をバブルチャートで描く

続きを見る

ubblechart_animation1820_2020_50_latest
【plotly&アニメーション】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

-go
-, ,