こんな人にオススメ
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
使用するデータと完成グラフイメージ
使用するデータ
今回使用するデータは以下の3種類。
- 世界各国の収入
- 世界各国の平均寿命
- 世界各国の人口
データは全て「Gapminder」からの引用で、基本的にこの組織からのデータだが一部のデータは使用していない。「Based on free material from GAPMINDER.ORG, CC-BY LICENSE」、すなわちフリーな素材ということだ。
このデータを知ったきっかけは、「FACTFULNESS」という本を読んだから。この本は執筆者が人生で一番読んで良かったと思っている本で、データや事実に基づきテレビなどでは知り得ない世界の本当の姿を知るという本だ。この本の著者がデータ引用元のギャップマインダー財団の共同創立者。
各データはGapminderの「Download the data」からダウンロードすることができる。収入、平均寿命、人口はそれぞれ以下の定義だ。
- 収入: 一人当たりGDPでその単位は「2011年の固定価格のinternational dollars」
- 平均寿命: 現在の死亡パターンが同じままである場合、新生児が生きる平均年数
- 人口: 単純にその国の総人口
完成グラフイメージ
グラフの最終完成イメージは以下の通り。
- 横軸: 各国の収入
- 縦軸: 各国の平均寿命
- バブルの大きさ: 各国の人口
今回は人口が多いほど赤系統のバブルに、少ないほど青系統のバブルになるように作成した。細かいことは後に解説する。
なお、「https://tools-legacy.gapminder.org/tools/#$state$marker$axis_y$domainMin:null&domainMax:null&zoomedMin:null&zoomedMax:null&spaceRef:null;;;&chart-type=bubbles」にギャップマインダーのグラフがある。クオリティはめちゃくちゃ高い。
グラフ作成全体コード
まずはバブルチャートの作成イメージを書く。特別な関数などは使わなくて、基本的にはplotly
のgo.Scatter
でmode
を'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で各国の収入と平均寿命の時代変化をバブルチャートで描く
続きを見る
-
-
【plotly&アニメーション】plotlyで各国の収入と平均寿命の時代変化をバブルチャート&アニメーションで描く
続きを見る