DataFrame.plot#

import pandas as pd
from sklearn import datasets
import seaborn as sns
sns.set()

まずはデータの作成

iris = datasets.load_iris()
df = pd.DataFrame(iris.data)
df.columns = iris.feature_names
df["label"] = iris.target
df.head()
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) label
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0
3 4.6 3.1 1.5 0.2 0
4 5.0 3.6 1.4 0.2 0

折れ線グラフ#

df.plot()
<Axes: >
../_images/19f22170b949031b0735f0f3199f0a7de6652936fda619be2fa88e1e22dcfb80.png

散布図#

df.plot(kind="scatter", x=0, y=1)
<Axes: xlabel='sepal length (cm)', ylabel='sepal width (cm)'>
../_images/75d4206960b0231259b6c790bc881a14d1196a2db55fc770f71fa1a2da2bfabb.png

クラスごとに色を変えてみましょう#

df.plot(
    kind="scatter",  # グラフの種類を指定
    x=0,             # x軸に対応する列の番号か列名
    y=1,             # y軸に対応する列の番号か列名
    c="label",       # 点の色を指定する列の番号か列名
    cmap="summer",   # 色合いの指定
    title="iris"     # プロットのタイトル
)
<Axes: title={'center': 'iris'}, xlabel='sepal length (cm)', ylabel='sepal width (cm)'>
../_images/9b303d0d56a3760d3fde02ae48328f439981c38f6a326ab6217aa5fb77d52531.png

棒グラフ#

可視化を簡単にするために、ここでdf[“label”]を変更しています。

df2 = df.copy()
df2["label"] = [iris.target_names[i] for i in iris.target]
df2.head()
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) label
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
df2[:20].plot(kind="bar", figsize=(20,8))
<Axes: >
../_images/8ab7ad9bb87ca30eba878ca1a51cb38cbc793f013e30dbb7ae186287cefaa6b1.png

特徴ごとにsubplotで別のプロットにしてみます#

df2[:20].plot(kind="bar", figsize=(20,8), subplots=True)
array([<Axes: title={'center': 'sepal length (cm)'}>,
       <Axes: title={'center': 'sepal width (cm)'}>,
       <Axes: title={'center': 'petal length (cm)'}>,
       <Axes: title={'center': 'petal width (cm)'}>], dtype=object)
../_images/0280658ca31e927bdaef826deb8f2e57ad227586452e711c42733a6ad4061305.png

subplotsのlayoutを変えてみます。#

df2[:20].plot(        # データ数が多いので上から20個だけ使います
    kind="bar",       # グラフ種類
    figsize=(10,10),  # グラフのサイズを指定します。
    subplots=True,    # Trueにするとグラフが要素ごとに別々に描画されます。
    layout=(2,2)      # グラフのlayoutを指定します。グラフの数を考慮してください。
)
array([[<Axes: title={'center': 'sepal length (cm)'}>,
        <Axes: title={'center': 'sepal width (cm)'}>],
       [<Axes: title={'center': 'petal length (cm)'}>,
        <Axes: title={'center': 'petal width (cm)'}>]], dtype=object)
../_images/6aebab4f0db7f8f3d7146d1dd74f489bc54c6b2a5d1c5694a1f49c712859ee8e.png

ヒストグラム#

df2.plot(kind="hist", figsize=(10,6))
<Axes: ylabel='Frequency'>
../_images/ecc6c7a1e2f4f7c48e9261f7ad00ab373e6737e14249d879b6af2ecf5f8d1389.png

透過率alphaを変えてみましょう。#

df2.plot(
    kind="hist",       # グラフの種類
    figsize=(10,6),    # プロットのサイズ(お好みで)
    alpha=0.7          # 透過させる場合は適当な数字を指定しましょう。
)
<Axes: ylabel='Frequency'>
../_images/0aa38997ef82e4945129d86b6cf372074a34f2e8aa74a535a90840adc921bf99.png

箱ひげ図#

df2.plot(kind="box")
<Axes: >
../_images/674a1080b1b66ff1857765f0b7e485dcc2c119ecf2c0c287429f2323d501a671.png

この他にplotで使えるkind#

help(df.plot)で確認ができます。

kind

| - ‘line’ : line plot (default)
| - ‘bar’ : vertical bar plot
| - ‘barh’ : horizontal bar plot
| - ‘hist’ : histogram
| - ‘box’ : boxplot
| - ‘kde’ : Kernel Density Estimation plot
| - ‘density’ : same as ‘kde’
| - ‘area’ : area plot
| - ‘pie’ : pie plot
| - ‘scatter’ : scatter plot
| - ‘hexbin’ : hexbin plot

発展#

matplotlibと組み合わせると、下のようなプロットも作れます。

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 2, figsize=(14, 10), sharey=True)
df.plot(ax=axes.flatten()[0])
df.plot(kind="scatter", x=0, y=1,ax=axes.flatten()[1])
df.plot(
    kind="scatter", 
    x=0, 
    y=1, 
    c="label", 
    cmap="summer", 
    title="iris",ax=axes.flatten()[2]
)
df[:20].plot(kind="bar",ax=axes.flatten()[3])
<Axes: >
../_images/4b4952e005d7dca8a8ae327c9c4449cb405f657607428fce9708ce81db88c922.png