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

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

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

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

意見交換

クローズ

4回答

1352閲覧

Python:データフレームを列ごとにプロット

d-hayahsi

総合スコア16

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Matplotlib

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

1グッド

0クリップ

投稿2023/02/01 02:24

編集2023/02/02 06:02

1

0

テーマ、知りたいこと

Pandasのデータフレームを列(カラム)ごとに可視化(折れ線グラフ)したいです。

現状としては、Pandasのplot()関数を用いて列ごとにプロットできましたが、
Y軸の目盛が100万を超えるとeを使った表現になってしまわないようにしたり、
グラフごとにタイトルの設定を行いたいです。
当初は、matplotlibを使って作業していましたが、うまくプロットできずにPandasを使っています。

該当のソースコード

Python

1import pandas as pd 2df = pd.read_csv("data.csv") 3df.plot( 4 subplots=True, 5 figsize=(40,80), # グラフサイズ(幅、高さ) 6 sharex=False, # 横軸の共有を解除 7 layout=(12, 2), 8 grid=True, 9) 10plt.show()

補足情報(FW/ツールのバージョンなど)

Windows 11
python : 3.10.8
pandas : 1.5.2
matplotlib : 3.6.3
jupyterlab : 3.5.2

ご回答いただいた方々へ

ご回答者の仰る通り、本件は意見交換ではなくQ&Aにすべきでした。
コメントができない為、こちらにコメントとして残すことにします。
やりたいこととして追加があります。
3桁ごとにコンマで区切りたいのですが、どのようにコーディングすれば
良いのでしょうか。
宜しくお願い致します。

追記
列ごとに個別の設定をするのはコードがかなり長くなるため、
for文を用いてアレンジしたいと考えております。

python

1fig = plt.figure(figsize = (40, 80), tight_layout=True) # グラフサイズ(幅、高さ) 2for col in range(df.shape[1]): 3 plt.subplot(12, 2, col+1) 4 plt.plot(df.iloc[:, col]) 5 6 for i in range(col): 7 plt.title(columns[i+1]) # 列No.をタイトルに 8 plt.ticklabel_format(style="plain", axis="y", scilimits=(0, 0)) # eを使わない表現 9 plt.gca().get_yaxis().set_major_formatter(ticker.FuncFormatter(lambda v,p: f'{int(v):,d}')) 10plt.show()

上記のように変更するとエラーになってしまいます。

error

1AttributeError: This method only works with the ScalarFormatter

また、上記のコードでは、0,0に表示されるグラフだけタイトルが表示されません。
これらはどのように解決できるでしょうか。
宜しくお願い致します。

追記
追加でご回答ありがとうございます。
タイトルだけ個別で設定すると冗長になるように思ったので、下記のように変更しました。
columnsという変数に項目名を入れたリストを作成しております。

Python

1columns = df.columns 2fig = plt.figure(figsize = (40, 80), tight_layout=True) # グラフサイズ(幅、高さ) 3for col in range(df.shape[1]): 4 plt.subplot(12, 2, col+1) 5 plt.plot(df.iloc[:, col]) 6 # plt.title("No." + str(col)) # 列Noをタイトル 7 plt.ticklabel_format(style="plain", axis="y", scilimits=(0, 0)) # eを使わない表現 8 plt.gca().get_yaxis().set_major_formatter(ticker.FuncFormatter(lambda v,p: f'{int(v):,d}')) # 3桁ごとにカンマで区切る 9 plt.grid() 10 # 列毎の個別設定 (必要なら) 11 for i in range(len(columns)): 12 if col == i: 13 plt.title(columns[i]) 14plt.show()
退会済みユーザー👍を押しています

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

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

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

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

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

回答4

#1

退会済みユーザー

退会済みユーザー

総合スコア0

投稿2023/02/01 05:24

編集2023/02/01 05:25

本当は「意見交換」ではなく「質問」の内容ですね。意見交換だとコメントができないのでこちらに…
・プログラムのimport部分まで書いてあった方が親切です。
・ダミーのグラフをプロットするためのデータ生成コードがあった方が検証しやすいです。
・どういう状態が良くなくて、どうしたいか、画像に起こしたグラフがあった方が親切です。

回答
やったことはありませんが、useMathText=Falseをすればmatplotlibで指数表示を強制オフに出来そうな気がします。
参考:https://cercopes-z.com/Python/matplotlib/parts-ticks-format-mpl.html

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

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

#2

jbpb0

総合スコア7651

投稿2023/02/01 05:36

編集2023/02/02 03:18

matplotlibを使って作業していましたが、うまくプロットできずに

どのように「うまく」できなかったのかを、具体的に書いた方がいいと思います

こんな感じでは、どうでしょうか?

python

1fig = plt.figure(figsize = (40, 80), tight_layout=True) # グラフサイズ(幅、高さ) 2for col in range(df.shape[1]): 3 plt.subplot(12, 2, col+1) 4 plt.plot(df.iloc[:, col]) 5 # 列毎の個別設定の例 6 if col == 0: 7 plt.title("No." + str(col)) # 列No.をタイトルに 8 plt.ticklabel_format(style="sci", axis="y", scilimits=(0, 0)) # eを使う表現 9 elif col == 3: 10 plt.title("333") # 文字列のタイトル 11 plt.ticklabel_format(style="sci", axis="y", scilimits=(0, 0)) # eを使う表現 12 else: 13 plt.title("aaa") # 文字列のタイトル 14 plt.ticklabel_format(style="plain", axis="y", scilimits=(0, 0)) # eを使わない表現 15 16plt.show()

 

3桁ごとにコンマで区切りたい

matplotlib.tickerで目盛りの数字を3桁カンマ区切りにする

 

列ごとに個別の設定をするのはコードがかなり長くなるため、for文を用いてアレンジしたい

python

1import matplotlib.ticker as ticker 2fig = plt.figure(figsize = (40, 80), tight_layout=True) # グラフサイズ(幅、高さ) 3for col in range(df.shape[1]): 4 plt.subplot(12, 2, col+1) 5 plt.plot(df.iloc[:, col]) 6 plt.title("No." + str(col)) # 列Noをタイトル 7 plt.ticklabel_format(style="plain", axis="y", scilimits=(0, 0)) # eを使わない表現 8 plt.gca().get_yaxis().set_major_formatter(ticker.FuncFormatter(lambda v,p: f'{int(v):,d}')) # 3桁ごとにカンマで区切る 9 # 列毎の個別設定 (必要なら) 10 if col == 3: 11 plt.title("333") # 文字列のタイトル 12 13plt.show()

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

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

#3

jbpb0

総合スコア7651

投稿2023/02/02 05:37

追加で質問がある

もともとの質問と内容が違うものは、別の質問にしてください
質問した内容が解決したら、それとは違うことを次々付け加えるのは、質問のやり方としておかしいと思います

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

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

#4

d-hayahsi

総合スコア16

投稿2023/02/02 06:01

下記コードで解決しました。

Python

1columns = df.columns 2 3fig = plt.figure(figsize = (40, 80), tight_layout=True) # グラフサイズ(幅、高さ) 4 5for col in range(df.shape[1]): 6 7 plt.subplot(12, 2, col+1) 8 9 plt.plot(df.iloc[:, col]) 10 11 # plt.title("No." + str(col)) # 列Noをタイトル 12 13 plt.ticklabel_format(style="plain", axis="y", scilimits=(0, 0)) # eを使わない表現 14 15 plt.gca().get_yaxis().set_major_formatter(ticker.FuncFormatter(lambda v,p: f'{int(v):,d}')) # 3桁ごとにカンマで区切る 16 17 plt.grid() 18 19 # 列毎の個別設定 (必要なら) 20 21 for i in range(len(columns)): 22 23 if col == i: 24 25 plt.title(columns[i]) 26 27plt.show()

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

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

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問