为什么我不能将 x 和 y 标签设置为 pd.plot() 的参数,而我可以轻松设置类似的内容,例如标题?

JC_*_*_CL 4 python plot matplotlib pandas

我正在使用 pandas 打印各种内容,使用内置plot命令,例如ipython 中的my_dataframe.plot()后跟plt.show()

\n\n

现在,这是一种非常简单方便的可视化方式,并且考虑到我无论如何都会对 SVG 文件进行后处理,所以我不太关心绘图的细节。

\n\n

然而,我需要一个标题、一个图例以及图上 x 和 y 轴的标签,既可以提醒自己什么是什么,也可以快速向其他人发送一些内容,而不必添加“哦,顺便说一句,这次 x 轴是小时,y 一如既往是米,但蓝色现在是电子邮件的示例 B\xe2\x80\xa6" 行。

\n\n

我想出了如何以简单的方式做到这一点(见下文),并且我也知道我可以用它做的各种强大的事情ax,但我花了一段时间才找到我的“简单”解决方案,并且我\我远离是ax因为有太多我既不需要也不理解的事情正在发生。

\n\n

我确实理解为什么人们想要 的所有强大选项ax,但我不明白为什么 pandas 绘图功能中不包含这样一个简单的选项。而且看来我并不是唯一一个这样的人。例如,用户 Chrispy 发布了这条评价很高的评论:

\n\n
\n

是否有特定原因导致 x 和 y 标签无法添加为参数pd.plot()pd.plot()鉴于over的额外简洁性,plt.plot()使其更加简洁而不是必须调用似乎是有意义的ax.set_ylabel()

\n
\n\n

关于这个问题的答案,但没有得到进一步的评论。因此我公然窃取这个问题。

\n\n

为什么plt.plot()默认情况下包含图例,并且还可以轻松地让我添加标题 ( my_df.plot(title = \'check out my cool plot\')),但逻辑下一步 ( my_df.plot(ylabel = \'size in meters\')) 结果却是TypeError: There is no Line2D property "ylabel"

\n\n

我是否遗漏了什么,或者这种疏忽是否有原因?

\n\n

示例代码:

\n\n

当我在真实文件中实现它并run workflow.py在 ipython 中运行它时,这是有效的,但在复制粘贴代码时我无法重现它。我的标签要么被忽略,要么彻底失败:

\n\n

编辑:

\n\n

最初,我plt.xlabel = \'time in seconds\'在这里的示例中,它不起作用,但我在真实代码中是正确的plt.xlabel(\'time in seconds\'),当然它起作用了。

\n\n
times = np.arange(0,43200,60)\nmy_df = pd.DataFrame(np.random.randn(len(times)), index = times)\nmy_df.plot(title = \'just some random data\')    #this works\n#my_df.plot(title = \'just some random data\', ylabel = \'size in meters\', xlabel = \'time in seconds\')    #this seems like the logical next step, but it errors\nplt.ylabel(\'size in meters\')\nplt.xlabel(\'time in seconds\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

这似乎是使用 @Johannes 解决方案的最简单/最小的解决方案axes,但我认为这(请参阅答案的评论)也是一个很好的说明,为什么我不想打扰自己axes

\n\n
axes = my_df.plot(title = \'just some random data\')\naxes.set_ylabel(\'size in meters\')\naxes.set_xlabel(\'time in seconds\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

另外,我可以用另一种方式设置标题,但标签只有一个选项,这让我感到困惑:

\n\n
axes = my_df.plot()\naxes.set_title(\'just some random data\')\naxes.set_ylabel(\'size in meters\')\naxes.set_xlabel(\'time in seconds\')\n
Run Code Online (Sandbox Code Playgroud)\n

Imp*_*est 6

首先,pandas 绘图命令没有特殊原因不包含标签的关键字参数,就像标题一样。
这个选项完全可以实现,但事实并非如此。推测原因不会有任何结果,但pandas 问题跟踪器上有一个问题上有一个关于它的问题。

对于实际问题,有多种方法可以为轴设置标签。下面列出了三种可能的方法。请注意,在问题和其他答案中都出现了一些非工作方法。

尤其ax.xlabel()是不存在。两者都没有plt.ylabel = 'size in meters'任何意义,因为它覆盖了ylabel方法而不是使用 它。

工作选项:

ax.set_xlabel()

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

times = np.arange(0,43200,60)
my_df = pd.DataFrame(np.random.randn(len(times)), index = times)
ax = my_df.plot(title = 'just some random data')

ax.set_ylabel('size in meters')
ax.set_xlabel('time in seconds')

plt.show()
Run Code Online (Sandbox Code Playgroud)

ax.set()

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

times = np.arange(0,43200,60)
my_df = pd.DataFrame(np.random.randn(len(times)), index = times)
ax = my_df.plot(title = 'just some random data')
ax.set(xlabel='time in seconds', ylabel='size in meters')

plt.show()
Run Code Online (Sandbox Code Playgroud)

plt.xlabel()

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

times = np.arange(0,43200,60)
my_df = pd.DataFrame(np.random.randn(len(times)), index = times)
my_df.plot(title = 'just some random data')

plt.ylabel('size in meters')
plt.xlabel('time in seconds')

plt.show()
Run Code Online (Sandbox Code Playgroud)

plt.setp()

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

times = np.arange(0,43200,60)
my_df = pd.DataFrame(np.random.randn(len(times)), index = times)
ax = my_df.plot(title = 'just some random data')

plt.setp(ax,xlabel='time in seconds', ylabel='size in meters')

plt.show()
Run Code Online (Sandbox Code Playgroud)