質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1311閲覧

複数のCSVを読んで可視化する事

samiarar

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/04/27 06:20

前提・実現したいこと

pythonでヒストグラムを描きたい。同じ列を持っている4つのファイルがあります。2016年〜2019年の間の地震データです。

  • I_earthquake2016.csv, I_earthquake2017.csv, I_earthquake2018.csv, I_earthquake2019.csv

一つのCSVファイルならコードを書きましたが4つのCSVファイルをループで処理するやり方を分からないです。具体的に知りたいことが
3*2のsubplotsを使って
4つのファイルを読んでどの年に地震の数が多かったかをバープロットで示したいsubplot(3,2,1)と(3,2,2)の位置に。
2016年の地震の数のばらつきを月によってsubplot(3,2,3)
2017年の地震の数のばらつきを月によってsubplot(3,2,4)
2018年の地震の数のばらつきを月によってsubplot(3,2,5)
2019年の地震の数のばらつきを月によってsubplot(3,2,6)

よろしくお願いします。初心者なので簡単な説明だと助かります。
■■1つのファイルのために書いたコードは

import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline data = pd.read_csv('I_earthquake2017.csv') data=data.drop(['magType','nst','gap','dmin','rms','net', 'id', 'updated', 'place', 'type', 'horizontalError', 'depthError', 'magError', 'magNst', 'status', 'locationSource', 'magSource'],axis=1) print(data[:1])

time latitude longitude depth mag

0 2017-12-30T20:53:24.700Z 29.4481 51.9793 10.0 4.9

data['time']=pd.to_datetime(data['time']) print(data[:1])

time latitude longitude depth mag
0 2017-12-30 20:53:24.700000+00:00 29.4481 51.9793 10.0 4.9

data['MONTH']=data['time'].dt.month data['YEAR']=data['time'].dt.year print(data[:1])

time latitude longitude depth mag MONTH
0 2017-12-30 20:53:24.700000+00:00 29.4481 51.9793 10.0 4.9 12

YEAR
0 2017

plt.hist(x=[data.MONTH],bins=12,alpha=0.5) plt.title("2017") plt.xlabel("month") plt.ylabel("number") plt.savefig("2017.png") plt.show()

イメージ説明
ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず複数のCSVファイルですが、各列に日時情報が入っているのであれば全てのデータをまとめて1つのDataFrameとして管理したほうが楽です。(データ量があまりにも大きくてメモリを圧迫する場合は除きますが)

複数のCSVファイルから1つのDataFrameを作成するのはこんな感じになります。

Python

1import pandas as pd 2import matplotlib.pyplot as plt 3 4files = ["I_earthquake2016.csv", 5 "I_earthquake2017.csv", 6 "I_earthquake2018.csv", 7 "I_earthquake2019.csv"] 8datas = [] 9for file in files: 10 data = pd.read_csv(file, parse_dates=['time'], index_col='time') 11 data = data.drop(['magType','nst','gap','dmin','rms','net', 'id', 'updated', 'place', 'type', 'horizontalError', 'depthError', 'magError', 'magNst', 'status', 'locationSource', 'magSource'],axis=1) 12 datas.append(data) 13df = pd.concat(datas) 14print(df)

上記のサンプルでは、

  • read_csv() のパラメータにparse_dates を渡して、time行をdatetime型で読み込む
  • read_csv() のパラメータにindex_col を渡して、上記 time行を Indexに設定

をしております。

このように、Indexにdatetime型のデータを渡して DatetimeIndex を設定するのは時系列データを扱う上でいろいろと便利なのでお勧めしておきます。

https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#indexing

で、上記のように纏められた DataFrame から年毎の処理を行うには、groupby() を使ってループ処理を行うことで

Python

1for year, d in df.groupby(df.index.year): 2 # 何かしらの処理 3 print(f"{year} 年のデータ") 4 print(d)

のように、ループ毎に year とそのデータを得ることが出来ます。

で、これを使ってグラフの描画部分を行うには、subplotの場所を指定するために更に enumerate を使って

Python

1fig, axs = plt.subplots(3,2, figsize=(10,6)) 2for p, (year, d) in enumerate(df.groupby(df.index.year)): 3 ax = axs[(p+2)//2, (p+2)%2] 4 ax.hist(x=d.index.month, bins=range(1,12+1),alpha=0.5) 5 ax.set_title(year) 6 ax.set_xlabel("month") 7 ax.set_ylabel("number") 8 9plt.tight_layout() 10plt.show()

こんな感じになるのではないでしょうか。

enumerate の部分が気に入らないのであれば dictを準備して

Python

1fig, axs = plt.subplots(3,2, figsize=(10,6)) 2pos = {2016:(1,0), 2017:(1,1), 2018:(2,0), 2019:(2,1)} 3for year, d in df.groupby(df.index.year): 4 ax = axs[pos[year][0], pos[year][1]] 5 ax.hist(x=d.index.month, bins=range(1,12+1),alpha=0.5) 6 ax.set_title(year) 7 ax.set_xlabel("month") 8 ax.set_ylabel("number") 9 10plt.tight_layout() 11plt.show()

のように書いても良いかもしれません。


【追記】

value_counts().plot.bar() で 描画するサンプル

Python

1fig, axs = plt.subplots(3,2, figsize=(10,6)) 2df.index.year.value_counts(sort=False).plot.bar(ax=axs[0,1]) 3pos = {2016:(1,0), 2017:(1,1), 2018:(2,0), 2019:(2,1)} 4for year, d in df.groupby(df.index.year): 5 ax = axs[pos[year][0], pos[year][1]] 6 d.index.month.value_counts(sort=False).plot.bar(ax=ax) 7 ax.set_title(year) 8 ax.set_xlabel("month") 9 ax.set_ylabel("number") 10 11plt.tight_layout() 12plt.show()

投稿2020/04/28 01:50

編集2020/04/28 10:32
magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

samiarar

2020/04/28 09:25

@magichan 丁寧な説明ありがとうございました。年ごとにヒストグラムを描けました。ただsubplots(0,1)のとこに(別の場所でも構わないです)x軸を年(2016〜2019)縦軸をnumber(発生回数)を入れたいのですが、教えていただいたことを真似いたつもりでやりましたが失敗。教えていただけませんか。よろしくお願いします
magichan

2020/04/28 10:13

ループの外で、のグラフ同様に axs[0,1].hist(x=df.index.year) のようすると書けませんか?
magichan

2020/04/28 10:36

これまでグラフの描画を質問のコードに合わせて plt.hist() を使用しておりましたが、個人的には(あくまでも個人的に)value_counts() した結果を bar() にて描画するほうが好みかも・・と思ったので更にサンプルを追加しまいた。(このサンプルには年度別のグラフも追加したので参考にしてください)
samiarar

2020/04/28 11:18

大変勉強になりました。ありがとうございました。bar plotの方が全然綺麗です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問