LoginSignup
1006

More than 5 years have passed since last update.

PythonでPandasのPlot機能を使えばデータ加工からグラフ作成までマジでシームレス

Last updated at Posted at 2016-03-01

Pandasのグラフ描画機能

この記事ではPandasのPlot機能について扱います。
Pandasはデータの加工・集計のためのツールとしてその有用性が広く知られていますが、同時に優れた可視化機能を備えているということは、意外にあまり知られていません。

image

この機能は Pandas.DataFrame.plot() もしくは Pandas Plot と呼ばれるものです。
Pandas Plotを使いこなすことが出来るようになれば、

  • データの読み込み、保持
  • データの加工
  • データの集計
  • データの可視化

というデータ分析の一連のプロセスを全てPandasで完結させることが出来る、つまり分析の「揺りかごから墓場まで」を実現することが出来ます。

Pandasのプロット以外の機能について

この記事ではPandasのデータハンドリングなどに関わる機能は説明しません。
そちらにも興味がある方は下記の記事などを参考にしてください

Python Pandasでのデータ操作の初歩まとめ
http://qiita.com/hik0107/items/d991cc44c2d1778bb82e

Pythonでのデータ分析初心者がまず見るべき情報源のまとめ
http://qiita.com/hik0107/items/0bec82cc09d0e05d5357

Pandas Plotとはなんなのか

Pandas PlotはPandasのデータ保持オブジェクトである "pd.DataFrame" のいちメソッドです。

pd.DataFrame.plot() はmatplotlibの薄いWrapperとして存在する。
pandasのplotは非常に簡単にイケてるプロットを作成する機能がある。

The plot method on Series and DataFrame is just a simple wrapper around plt.plot():
We provide the basics in pandas to easily create decent looking plots

- 公式ドキュメントより

Pandasのplotメソッドでサポートされているグラフの種類は下記の通り
またpandasのver0.17以上であれば、さらに多くの種類のグラフが用意されています。

  • bar (barh) : 棒グラフ もしくは 横向き棒グラフ
  • hist :ヒストグラム
  • box : 箱ひげ図
  • kde :確率密度分布
  • area : 面積グラフ
  • scattter : 散布図
  • hexbin :密度情報を表現した六角形型の散布図
  • pie :円グラフ

Pandas Plotの文法上の特徴

"Pandas Plot" はPandas.DataFrameという、データオブジェクト自身のメソッドであることに由来して、通常のチャート作成ライブラリとはやや違いがあります。

違いというか、利点と言ってしまってもいいかもしれません。
大抵の場合は相対的に言ってシンプルに記述することが可能です。

例として、PandasPlotと同様にMatplotlibのラッパーであるビジュアライズライブラリの seabornと文法を比較してみます。

pandasplot.py
df.plot.scatter(x='xdata', y='ydata')
seaborn.py
sns.jointplot(x='xdata', y='ydata', data=df)

seabornのように data=dfみたいな記述をしなくてよいのが良い!可読性も上がる!
(効果には個人差があります)

また、x軸に使うのがDataFrameのIndexである場合にはさらに簡単です

pandasplot.py
df.plot.scatter(y='ydata') # xの指定は省略可能

補足-seaborn

seabornについてはよければ下記の記事を参照して下さい

pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る
http://qiita.com/hik0107/items/3dc541158fceb3156ee0

各種のチャートの紹介

実際にコードを書いて動かしながら進められるように、データのDLから始めます

import.py
# グラフ化に必要なものの準備
import matplotlib
import matplotlib.pyplot as plt

# データの扱いに必要なライブラリ
import pandas as pd
import numpy as np
import datetime as dt

下記のおまじない設定をしておくとチャートが綺麗にかけます

plt.style.use('ggplot') 
font = {'family' : 'meiryo'}
matplotlib.rc('font', **font)

こんな感じ適当にデータを作ります

data.py
url = 'https://vincentarelbundock.github.io/Rdatasets/csv/robustbase/ambientNOxCH.csv'
df_sample = pd.read_csv(url, parse_dates=1, index_col=1)

# dfの準備
df = df_sample.iloc[:, 1:]

# df_monthlyの準備
df_monthly = df.copy()
df_monthly.index = df_monthly.index.map(lambda x: x.month)
df_monthly = df_monthly.groupby(level=0).sum()

このdfとdf_monthlyで色んなグラフを書いてみます

棒グラフ

df_monthly.plot.bar(y=['ad', 'ba', 'se'], alpha=0.6, figsize=(12,3))
plt.title(u'普通の棒グラフ', size=16)

image

3つのカテゴリを合わせて一本のバーにしたい場合は

df_monthly.plot.bar(y=['ad', 'ba', 'se'], alpha=0.6, figsize=(12,3), stacked=True, cmap='Blues')
plt.title(u'積み上げ型の棒グラフ', size=16)

image

時系列グラフ

df.plot( y=['ad', 'ba', 'ef'], figsize=(16,4), alpha=0.5)

image

ヒストグラム

ax= df.plot( y=['ad', 'ba', 'ef'], bins=50, alpha=0.5, figsize=(16,4), kind='hist')

image

散布図

色を塗り分けたり、サイズを描き分けたり色々出来る

fig, axes = plt.subplots(2, 2, figsize=(14, 10), sharey=True)

# 1.普通のプロット
df[0:150].plot(x='ad', y='ba', kind='scatter', ax=axes.flatten()[0])
# 2.離散値を色で表す
df[0:150].plot(x='ad', y='ba', kind='scatter', c='ef', cmap='Blues', ax=axes.flatten()[1])
# 3.離散値をバブルサイズで表す(ちょっと数は減らしてる)
df[0:150].plot.scatter(x='ad', y='ba', s=(df['su']-20)*3, ax=axes.flatten()[2])
# 4.両方同時に使う
df[0:150].plot.scatter(x='ad', y='ba', s=(df['su']-20)*3, c='ef', ax=axes.flatten()[3])

image

なんかカッコイイ!

散布図とちょっと違うがこういうのもある
Hexabinというらしいです。

df[0:150].plot(x='ad', y='ba',kind='hexbin', gridsize=20)

image

その他

円グラフ(あんまり使わない)

df_monthly.plot( kind='pie', y = 'se')

image

エリアチャート(あんまり使わない)

df_monthly.plot(y=['se', 'ef'], kind='area', stacked=True, alpha=0.4)

image

まとめ

Pandasのプロット機能マジ便利。
データの読み込みから分析、グラフ化まで一気に出来て最高。

参考サイト

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1006