トップページに戻る

Seaborn ― matplotlib をより美しく、使いやすく

In [1]:
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
In [2]:
x = np.linspace(0,2*np.pi,1024)
plt.plot(x, np.sin(x))
Out[2]:
[<matplotlib.lines.Line2D at 0x7f35ce360ba8>]

seaborn を import するだけで、スタイルが適用されます。

In [3]:
import seaborn as sns
In [4]:
plt.plot(x, np.sin(x))
Out[4]:
[<matplotlib.lines.Line2D at 0x7f35c38b0048>]

他のスタイルも適用できます。

In [5]:
sns.set_style("whitegrid")
plt.plot(x, np.sin(x))
Out[5]:
[<matplotlib.lines.Line2D at 0x7f35c37dd438>]

Seaborn は pandas と連携することで真価をみせます。

さきほどの人口データです。

In [54]:
import pandas as pd

df = pd.read_csv("c02.csv", encoding="utf-8")
df
Out[54]:
prefecturecode prefecture 元号 和暦(年) year population male female
0 00 全国 大正 9 1920 NaN 55963053 28044185 27918868
1 01 北海道 大正 9 1920 NaN 2359183 1244322 1114861
2 02 青森県 大正 9 1920 NaN 756454 381293 375161
3 03 岩手県 大正 9 1920 NaN 845540 421069 424471
4 04 宮城県 大正 9 1920 NaN 961768 485309 476459
5 05 秋田県 大正 9 1920 NaN 898537 453682 444855
6 06 山形県 大正 9 1920 NaN 968925 478328 490597
7 07 福島県 大正 9 1920 NaN 1362750 673525 689225
8 08 茨城県 大正 9 1920 NaN 1350400 662128 688272
9 09 栃木県 大正 9 1920 NaN 1046479 514255 532224
10 10 群馬県 大正 9 1920 NaN 1052610 514106 538504
11 11 埼玉県 大正 9 1920 NaN 1319533 641161 678372
12 12 千葉県 大正 9 1920 NaN 1336155 656968 679187
13 13 東京都 大正 9 1920 NaN 3699428 1952989 1746439
14 14 神奈川県 大正 9 1920 NaN 1323390 689751 633639
15 15 新潟県 大正 9 1920 NaN 1776474 871532 904942
16 16 富山県 大正 9 1920 NaN 724276 354775 369501
17 17 石川県 大正 9 1920 NaN 747360 364375 382985
18 18 福井県 大正 9 1920 NaN 599155 293181 305974
19 19 山梨県 大正 9 1920 NaN 583453 290817 292636
20 20 長野県 大正 9 1920 NaN 1562722 758639 804083
21 21 岐阜県 大正 9 1920 NaN 1070407 536334 534073
22 22 静岡県 大正 9 1920 NaN 1550387 774169 776218
23 23 愛知県 大正 9 1920 NaN 2089762 1033860 1055902
24 24 三重県 大正 9 1920 NaN 1069270 525957 543313
25 25 滋賀県 大正 9 1920 NaN 651050 313737 337313
26 26 京都府 大正 9 1920 NaN 1287147 650780 636367
27 27 大阪府 大正 9 1920 NaN 2587847 1344846 1243001
28 28 兵庫県 大正 9 1920 NaN 2301799 1175426 1126373
29 29 奈良県 大正 9 1920 NaN 564607 280383 284224
... ... ... ... ... ... ... ... ... ...
949 18 福井県 平成 27 2015 NaN 786740 381474 405266
950 19 山梨県 平成 27 2015 NaN 834930 408327 426603
951 20 長野県 平成 27 2015 NaN 2098804 1022129 1076675
952 21 岐阜県 平成 27 2015 NaN 2031903 983850 1048053
953 22 静岡県 平成 27 2015 NaN 3700305 1820993 1879312
954 23 愛知県 平成 27 2015 NaN 7483128 3740844 3742284
955 24 三重県 平成 27 2015 NaN 1815865 883516 932349
956 25 滋賀県 平成 27 2015 NaN 1412916 696941 715975
957 26 京都府 平成 27 2015 NaN 2610353 1248972 1361381
958 27 大阪府 平成 27 2015 NaN 8839469 4256049 4583420
959 28 兵庫県 平成 27 2015 NaN 5534800 2641561 2893239
960 29 奈良県 平成 27 2015 NaN 1364316 643946 720370
961 30 和歌山県 平成 27 2015 NaN 963579 453216 510363
962 31 鳥取県 平成 27 2015 NaN 573441 273705 299736
963 32 島根県 平成 27 2015 NaN 694352 333112 361240
964 33 岡山県 平成 27 2015 NaN 1921525 922226 999299
965 34 広島県 平成 27 2015 NaN 2843990 1376211 1467779
966 35 山口県 平成 27 2015 NaN 1404729 665008 739721
967 36 徳島県 平成 27 2015 NaN 755733 359790 395943
968 37 香川県 平成 27 2015 NaN 976263 472308 503955
969 38 愛媛県 平成 27 2015 NaN 1385262 654380 730882
970 39 高知県 平成 27 2015 NaN 728276 342672 385604
971 40 福岡県 平成 27 2015 NaN 5101556 2410418 2691138
972 41 佐賀県 平成 27 2015 NaN 832832 393073 439759
973 42 長崎県 平成 27 2015 NaN 1377187 645763 731424
974 43 熊本県 平成 27 2015 NaN 1786170 841046 945124
975 44 大分県 平成 27 2015 NaN 1166338 551932 614406
976 45 宮崎県 平成 27 2015 NaN 1104069 519242 584827
977 46 鹿児島県 平成 27 2015 NaN 1648177 773061 875116
978 47 沖縄県 平成 27 2015 NaN 1433566 704619 728947

979 rows × 9 columns

自動的にフィッティングを行わせます。ラベルも自動でつきます。

In [16]:
sns.lmplot(x="year", y="population", hue='prefecturecode', order=2, data=df)
Out[16]:
<seaborn.axisgrid.FacetGrid at 0x7f35c2373a58>

1920 年の県別人口と、2000年の県別人口がどのように相関しているか調べたいとします。 これにはpairplotが使えます。

まず、Dataframe を少し変換して、県 × 各年の人口の表の形式にします。

In [56]:
df2 = pd.DataFrame(columns=(np.arange(1920,2015,40)))
for i in range(1,48):
  dfi = df.ix[df.ix[:,'prefecturecode'] == "{:02d}".format(i),['year','population']]
  df2.loc[i] = (np.array(dfi['population']))[1::8]
df2
Out[56]:
1920 1960 2000
1 2498679.0 5171800.0 5627737.0
2 812977.0 1416591.0 1436657.0
3 900984.0 1411118.0 1385041.0
4 1044036.0 1753126.0 2360218.0
5 936408.0 1279835.0 1145501.0
6 1027297.0 1263103.0 1216181.0
7 1437596.0 1983754.0 2091319.0
8 1409092.0 2056154.0 2975167.0
9 1090428.0 1521656.0 2016631.0
10 1118858.0 1605584.0 2024135.0
11 1394461.0 3014983.0 7054243.0
12 1399257.0 2701770.0 6056462.0
13 4485144.0 10869244.0 12576601.0
14 1416792.0 4430743.0 8791597.0
15 1849807.0 2398931.0 2431459.0
16 749243.0 1025465.0 1111729.0
17 750854.0 980499.0 1174026.0
18 597899.0 750557.0 821592.0
19 600675.0 763194.0 884515.0
20 1629217.0 1958007.0 2196114.0
21 1132557.0 1700365.0 2107226.0
22 1671217.0 2912521.0 3792377.0
23 2319494.0 4798653.0 7254704.0
24 1107692.0 1514467.0 1866963.0
25 662412.0 853385.0 1380361.0
26 1406382.0 2102808.0 2647660.0
27 3059502.0 6657189.0 8817166.0
28 2454679.0 4309944.0 5590601.0
29 583828.0 825965.0 1421310.0
30 787511.0 1026975.0 1035969.0
31 472230.0 579853.0 607012.0
32 722402.0 821620.0 742223.0
33 1238447.0 1645135.0 1957264.0
34 1617680.0 2281146.0 2876642.0
35 1094544.0 1543573.0 1492606.0
36 689814.0 815115.0 809950.0
37 700308.0 900845.0 1012400.0
38 1096366.0 1446384.0 1467815.0
39 687478.0 812714.0 796292.0
40 2301668.0 3964611.0 5049908.0
41 684831.0 871885.0 866369.0
42 1163945.0 1641245.0 1478632.0
43 1296086.0 1770736.0 1842233.0
44 915136.0 1187480.0 1209571.0
45 691094.0 1080692.0 1153042.0
46 1472193.0 1853541.0 1753179.0
47 557622.0 945111.0 1392818.0
In [57]:
sns.pairplot(df2)
Out[57]:
<seaborn.axisgrid.PairGrid at 0x7f35c274f278>
In [ ]:
 

誤字やおかしい点などがあったら @zawawahoge (Twitter) にお気軽にご連絡ください。

トップページに戻る