matplotlib でプロットが直線になったときにやってみたこと

Python

matplotlibで可視化をしたときにプロットがなぜか直線になってしまったので、それを修正したときのメモを書いておきます。

この記事はこんな人におすすめ。

  • matplotlibを使った描画がうまくいかない
  • データタイプ変更の仕方がよく分からない

プログラミング無料体験はこちら↓↓↓


データファイルの読み込み

まずは普通にデータファイルを読み込んで、表示してみましょう。

データは政府統計の総合窓口から「年次別農業総産出額及び生産農業所得_実額」をCSVファイルでダウンロードし、それをPythonで読み込んでみました。

# 表データの扱いに必要なライブライのインポート
import pandas as pd

#データの読み込み
agri_pro_incom = pd.read_csv('年次別農業総産出額及び生産農業所得_実額.csv', 
              encoding = 'shift-jis', index_col=0)

# データの表示
agri_pro_incom

上記のコードを実行すると、以下のDetaFramを得ることができます。

しかしよく見ると、データが降順になってしまっているので、sort_index()を使って昇順に直してします。

ちなみにsort_index()は昇順ですが、降順にしたい場合はsort_index(ascending=False)にします。

# データを昇順に並べ替える
agri_pro_incom = agri_pro_incom.sort_index()
agri_pro_incom

並べ替え完了です。

matplotlibで可視化を行う

ではさっそくmatplotlib を使って、データを可視化してみましょう。

まず「農業総産出額」のデータを時系列で可視化してみます。

# 必要なライブラリのインポート
from matplotlib import pyplot as plt 
import numpy as np 

plt.rcParams["figure.figsize"] = (25, 12) # プロットのサイズ設定
plt.rcParams['font.family'] = "MS Gothic" # フォント設定。文字の豆腐化防止
plt.xticks(np.arange(0, 63)) # 軸の目盛りは0 から 63まで。
plt.xticks(rotation=90) # x軸のラベルがかぶらないように90度に反転
plt.title('農業総産出額', fontsize=25) 
plt.xlabel('時点', fontsize = 25) 
plt.ylabel('農業総産出額【億円】',fontsize = 18) 
plt.legend(['農業産出額【億円】']) 
plt.grid() 
plt.ticklabel_format(style='plain',axis='y') 

# プロット表示
plt.plot(agri_pro_incom['農業総産出額【億円】'])

プログラムを実行したときに得られたプロットが以下。

さすがにこれは変なのでいろいろ調べてみると、データ型に問題があることが判明。

なので.dtypesを使って、DataFrameのデータ型を調べてみます。

print(agri_pro_incom.dtypes)

農業総産出額【億円】                     object
耕種_計【億円】                       object
耕種_米【億円】                       object
耕種_麦類【億円】                      object
耕種_雑穀【億円】                       int64
耕種_豆類【億円】                      object
耕種_いも類【億円】                     object
耕種_野菜_小計【億円】                   object
耕種_野菜_果菜類【億円】                  object
耕種_野菜_葉茎菜類【億円】                 object
耕種_野菜_根菜類【億円】                  object
耕種_果実【億円】                      object
耕種_花き【億円】                      object
耕種_工芸農作物【億円】                   object
耕種_その他作物【億円】                   object
畜産_計【億円】                       object
畜産_肉用牛【億円】                     object
畜産_乳用牛【億円】                     object
畜産_乳用牛_生乳【億円】                  object
畜産_豚【億円】                       object
畜産_鶏【億円】                       object
畜産_鶏_鶏卵【億円】                    object
畜産_鶏_ブロイラー【億円】                 object
畜産_養蚕【億円】                      object
畜産_その他畜産物【億円】                   int64
加工農産物【億円】                       int64
生産農業所得【億円】                     object
(参考)農業総産出額に占める生産農業所得の割合【%】    float64
dtype: object

こんな感じで各列のデータ型が分かるのですが、可視化したい列「農業総産出額」を見るとObject型になっています。

Object型とはデータを抽象的に表したものということで、数字ではなくマークのようなものとして扱われています。

これをint型、つまり整数型に直す必要があります。

.astype()を使いデータ型を変換し、再び可視化にしてみます。

agri_pro_incom['農業総産出額【億円】'] = agri_pro_incom['農業総産出額【億円】'].astype(int)

しかし結果は再びただの直線。

そこでもう少し調べてみると、「 , (カンマ)」を消す必要があるということで.replace()を使って、数値すべてをint型に変換しました。

agri_pro_incom['農業総産出額【億円】'] = agri_pro_incom['農業総産出額【億円】']
              .str.replace(',', '').astype(int)

そしてもう一度可視化にトライ。

from matplotlib import pyplot as plt
import numpy as np
plt.rcParams["figure.figsize"] = (25, 12)
plt.rcParams['font.family'] = "MS Gothic"
plt.xticks(np.arange(0, 63))
plt.xticks(rotation=90)
plt.title('農業総産出額', fontsize=25)
plt.xlabel('時点', fontsize = 25)
plt.ylabel('農業総産出額【億円】',fontsize = 18)
plt.legend(['農業産出額【億円】'])
plt.grid()
plt.ticklabel_format(style='plain',axis='y')
plt.plot(agri_pro_incom['農業総産出額【億円】'])

無事プロットが出来上がりました。

プログラミング無料体験はこちら↓↓↓



関連記事:

Python でデータ分析:DataFrameの整理とデータ型の変換
Python でCSVファイルを読みこんでもこのままでは分析に使えないので、データの整形が必要になります。 この記事は以下のような人におすすめ。 pandas で不要なヘダーの削除方法を知りたい n...
Python を使ったスクレイピングから棒グラフの作成
ウェッブサイトから必要な情報を抜き出す、スクレイピングから棒グラフの作成までをやってみました。 簡単かと思えましたが、時間かかってしまったんで今後のためにメモ書いておきます。 この記事はこんな人におすすめ。 ...

コメント

タイトルとURLをコピーしました