JC_*_*_CL 4 python plot matplotlib pandas
我正在使用 pandas 打印各种内容,使用内置plot命令,例如ipython 中的my_dataframe.plot()后跟plt.show()。
现在,这是一种非常简单方便的可视化方式,并且考虑到我无论如何都会对 SVG 文件进行后处理,所以我不太关心绘图的细节。
\n\n然而,我需要一个标题、一个图例以及图上 x 和 y 轴的标签,既可以提醒自己什么是什么,也可以快速向其他人发送一些内容,而不必添加“哦,顺便说一句,这次 x 轴是小时,y 一如既往是米,但蓝色现在是电子邮件的示例 B\xe2\x80\xa6" 行。
\n\n我想出了如何以简单的方式做到这一点(见下文),并且我也知道我可以用它做的各种强大的事情ax,但我花了一段时间才找到我的“简单”解决方案,并且我\我远离是ax因为有太多我既不需要也不理解的事情正在发生。
我确实理解为什么人们想要 的所有强大选项ax,但我不明白为什么 pandas 绘图功能中不包含这样一个简单的选项。而且看来我并不是唯一一个这样的人。例如,用户 Chrispy 发布了这条评价很高的评论:
\n\n\n是否有特定原因导致 x 和 y 标签无法添加为参数
\npd.plot()?pd.plot()鉴于over的额外简洁性,plt.plot()使其更加简洁而不是必须调用似乎是有意义的ax.set_ylabel()
关于这个问题的答案,但没有得到进一步的评论。因此我公然窃取这个问题。
\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当我在真实文件中实现它并run workflow.py在 ipython 中运行它时,这是有效的,但在复制粘贴代码时我无法重现它。我的标签要么被忽略,要么彻底失败:
编辑:
\n\n最初,我plt.xlabel = \'time in seconds\'在这里的示例中,它不起作用,但我在真实代码中是正确的plt.xlabel(\'time in seconds\'),当然它起作用了。
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\')\nRun Code Online (Sandbox Code Playgroud)\n\n这似乎是使用 @Johannes 解决方案的最简单/最小的解决方案axes,但我认为这(请参阅答案的评论)也是一个很好的说明,为什么我不想打扰自己axes:
axes = my_df.plot(title = \'just some random data\')\naxes.set_ylabel(\'size in meters\')\naxes.set_xlabel(\'time in seconds\')\nRun Code Online (Sandbox Code Playgroud)\n\n另外,我可以用另一种方式设置标题,但标签只有一个选项,这让我感到困惑:
\n\naxes = my_df.plot()\naxes.set_title(\'just some random data\')\naxes.set_ylabel(\'size in meters\')\naxes.set_xlabel(\'time in seconds\')\nRun Code Online (Sandbox Code Playgroud)\n
首先,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)