【问题标题】:How modules know each other模块如何相互了解
【发布时间】:2016-10-08 12:15:48
【问题描述】:

我可以使用以下代码从 CSV 文件中绘制数据:

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('test0.csv',delimiter='; ', engine='python')
df.plot(x='Column1', y='Column3')
plt.show()

但我不明白一件事。 plt.show() 是如何知道df 的?我会在某处看到类似这样的表达式:

plt = something(df)

我不得不提一下,我只是在学习 Python。

【问题讨论】:

  • 基本上df也导入plt并直接修改。 plt 使用了大量可供用户和代码访问的全局状态。

标签: python python-2.7


【解决方案1】:

Matplotlib 有两个“接口”:Matlab-style interfaceobject-oriented interface

使用 Matlab 风格的界面绘图如下所示:

import matplotlib.pyplot as plt
plt.plot(x, y)
plt.show()

plt.plot 的调用隐式地创建了一个图形和一个要在其上绘制的轴。 对plt.show 的调用会显示所有数字。

Pandas 通过在调用 df.plot(x='Column1', y='Column3') 时为您隐式创建图形和轴来支持 Matlab 样式的界面。

Pandas 也可以使用更灵活的面向对象接口,在这种情况下 您的代码如下所示:

import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv('test0.csv',delimiter='; ', engine='python')
fig, ax = plt.subplots()
df.plot(ax=ax, x='Column1', y='Column3')
plt.show()

这里的坐标区 ax 被显式创建并传递给 df.plot,然后 在后台调用ax.plot

面向对象接口有用的一种情况是,当您希望使用 df.plot 不止一次在同一轴上绘图:

fig, ax = plt.subplots()
df.plot(ax=ax, x='Column1', y='Column3')
df2.plot(ax=ax, x='Column2', y='Column4')
plt.show()

【讨论】:

  • fig, ax = plt.subplots()是什么意思?我只期待左侧的一件事。
  • 该图负责显示整个图像。轴负责绘图区域。一个图形可以包含许多轴。有关 matplotlib 对象层次结构如何组织的更多信息,请参阅stackoverflow.com/a/14846126/190597
  • @KcFnMi plt.subplots 返回两个对象,可以分配给一个名称来创建一个元组,也可以分别分配给两个名称。
【解决方案2】:

来自plotting 上的 pandas 文档:

Series 和 DataFrame 上的 plot 方法只是一个简单的包装器 周围:meth:plt.plot() <matplotlib.axes.Axes.plot>

因此,df.plot 方法是对plt.plot 的高级调用(使用包装器),此后,调用plt.show 将简单地:

显示所有图形并阻塞直到图形关闭

就像使用plt.plot 绘制的所有数字一样。


因此,您看不到plt = something(df),因为matpotlib.pyplot.plotdf.plot 调用在幕后

【讨论】:

  • 我明白了。但是我想问一下,有没有办法写代码让魔法变得更加明确?
  • @KcFnMi 我认为您不需要显式魔法。该包装器为我们省去了将所需的 args 和 kwargs 传递给 plt.plot 的麻烦,因为有时需要复杂的数据帧。
【解决方案3】:

根据http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.showplt.show()本身不知道数据,需要将数据作为参数传递。

你看到的应该是pandas库的情节,按照http://pandas.pydata.org/pandas-docs/stable/visualization.html#basic-plotting-plot的用法。

希望这能解决您的问题。

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2010-11-07
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多