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

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

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

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

Python 3.x

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

pandas

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

Q&A

2回答

2721閲覧

pandas.DataFrameのplotで、なぜmatplotlib.pyplotが利用できるのか?

okahijiki

総合スコア404

Matplotlib

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

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2021/07/09 00:44

pandasで作ったDataFrameを、
pandasに組み込まれているplotメソッドにてグラフを描くことに違和感はありません。

一方、DataFrameで、matplotlib.pyplotのメソッドが利用できてしまうことに、
「あれ、なんで出来るんだろう?」と思ってしまいます。

ためしに、以下のdf(DataFrameで作成したオブジェクト)を、dir(df)にて、利用できるメソッドを確かめてみると、
その中にはmatplotlib.pyplotに関係するメソッドは見当たりません。

ご教示のほど、よろしくお願いいたします。

python

1import pandas as pd 2import matplotlib.pyplot as plt 3plt.rcParams['font.family'] = 'IPAPGothic' 4 5x=[0,3,3] 6y=[0,2,4] 7df=pd.DataFrame(x,y,columns=['訪問回数/契約回数']) 8 9import numpy as np 10df.plot(marker='o',linestyle='None') 11plt.ylim([-0.5,5]) 12plt.ylim([-0.5,5]) 13plt.xlabel('訪問回数') 14plt.ylabel('契約回数') 15plt.grid() 16plt.show()

イメージ説明

python

1dir(df)

イメージ説明

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

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

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

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

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

guest

回答2

0

df.plotのあとに、なぜplt.ylimやplt.xlabelなどが影響を与えるかという質問だとすると以下の理由です。

理由1 pandasがmatplotlibをimportしている。

pandasががmatplotlibをimportしている場所は、

*/Lib/site-packages/pandas/plotting/_core.py
*/Lib/site-packages/pandas/plotting/_matplotlib/init.py

python

1def plot(data, kind, **kwargs): 2 # Importing pyplot at the top of the file (before the converters are 3 # registered) causes problems in matplotlib 2 (converters seem to not 4 # work) 5 import matplotlib.pyplot as plt

とかです。

理由2 matplotlibは描画関数の後でも軸などの設定ができる。

これはmatplotlibの仕様です。
matplotlibのいくつかの機能を使うためにはをdf.plotの前matplotlibの関数を使って準備しておく必要があり場合もあります。

1点目
上記の_core.pyは、import pandasの際に読み込まれるのでしょうか。

plotが最初に呼ばれたときです。

2点目
もしimport pandasにより、matplotlibが同時にimportされるのなら、あえてimport matplotlibを(jupyterNotebookの)セルに記述する必要は、ないのでは、ないでしょうか。

Pythonにimportされるのと、それにある名前を使ってアクセスできるのは違います。
明にimportせずに使う方法はありますが不便です。以下のように

python

1df.plot() 2impot sys 3sys.modules['matplotlib.pyplot'].xlabel('訪問回数') 4sys.modules['matplotlib.pyplot'].show()

とか書けば動作はしますが、やりたくないでしょう。

一般的にモジュールをimportした場合、そのモジュールがまだimportされていなければそのモジュールを読み込みますが、既に読み込まれている場合は読み込み済みのモジュールを指定された名前に束縛(bind)するだけです。

既にmatplotlibがどこかでimportされているなら、
import matplotlib.pyplot as plt

impot sys
plt = sys.modules['matplotlib.pyplot']
は全く同じ意味ですので、普通は前者を使います。

投稿2021/07/09 02:31

編集2021/07/09 05:18
ppaul

総合スコア24670

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

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

okahijiki

2021/07/09 03:25

ご回答、ありがとうございます。 以下のパスおよび、_core.pyの該当部分確認できました。 /Lib/site-packages/pandas/plotting/_core.py 基本的なことについて、2点、再質問させてくださいませ。 1点目 上記の_core.pyは、import pandasの際に読み込まれるのでしょうか。 2点目 もしimport pandasにより、matplotlibが同時にimportされるのなら、あえてimport matplotlibを(jupyterNotebookの)セルに記述する必要は、ないのでは、ないでしょうか。 よろしく、お願いいたします。
ppaul

2021/07/09 05:19

先ほどの場所に間違いがあったので修正し、また質問への回答を追加しました。
okahijiki

2021/07/09 06:34

一度、matplotlibをインストールすれば、後は、import matplotlibにて、適宜、読み込める。 ありがとうございます。理解できそうです。 本件について、次のような仮説を立ててみました。 質問で書いたコードは、matplotlibAPIを通じて、pandasでも、matplotlibのメソッドが使える。 で、比較できるように、話を広げますが(失礼します) それに対して、以下のような書き方は(APIではなく)matplotlib自身を利用している。 import matplotlib.pyplot as plt fig = plt.figure() ax=fig.add_subplot(1,1,1) ax.plot(df,marker='o',linestyle='None') plt.ylim([-0.5,5]) plt.ylim([-0.5,5]) plt.xlabel('訪問回数') plt.ylabel('契約回数') plt.grid() plt.show()
ppaul

2021/07/11 16:17

私はmatplotlibAPIというものを読んだことも聞いたこともありません。 単純にpandasの中でmatplotlibを使っているだけです。
guest

0

ありませんか?

(目視じゃなくてコードで確認してみました)

python

1>>> import pandas as pd 2 3>>> x=[0,3,3] 4 5>>> y=[0,2,4] 6 7>>> df=pd.DataFrame(x,y,columns=['訪問回数/契約回数']) 8 9>>> 'plot' in dir(df) 10True

結局質問がわかりませんが
https://github.com/pandas-dev/pandas/blob/v1.3.0/pandas/core/frame.py#L10562
https://github.com/pandas-dev/pandas/blob/v1.3.0/pandas/plotting/_core.py#L891
https://github.com/pandas-dev/pandas/blob/v1.3.0/pandas/plotting/_core.py#L1790
https://github.com/pandas-dev/pandas/blob/v1.3.0/pandas/plotting/_core.py#L1731
https://github.com/pandas-dev/pandas/blob/v1.3.0/pandas/plotting/_core.py#L1752
https://github.com/pandas-dev/pandas/blob/v1.3.0/pandas/plotting/_matplotlib/init.py
と呼び出されていきます。
matplotlibを直にインポートしているのはpandas.plotting._matplotlibの中のモジュール達です。

pandasがもう1段、処理を抽象化していて、デフォルトのバッグエンドがmatplotlibだということかと。

投稿2021/07/09 01:19

編集2021/07/09 04:56
quickquip

総合スコア11235

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

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

okahijiki

2021/07/10 23:26

ご回答、ありがとうございます。 返答、遅くなってしまいました。恐縮です。 GitHubにアップされている、貼っていただいたURL開いてみましたが、 コードを読むことができませんでした汗 ただし、pandasがimportされる際の、最後のディレクトリ、 https://github.com/pandas-dev/pandas/blob/v1.3.0/pandas/plotting/_matplotlib/init.py に、matplotlib関係のモジュールがimportされていることが確認できました。 すなわち「import pandasの際に、matplotlib関係のモジュールも同時にimportされている」と とらえても良いでしょうか。 よろしく、お願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問