当前位置: 首页 > 知识库问答 >
问题:

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

华乐逸
2023-03-14

我正在用熊猫打印各种东西,使用内置的命令,比如ipython中的my_dataframe.plot()后面跟着plt.show()

现在,这是一种非常简单方便的可视化方式,考虑到我对SVG文件进行了后处理,我不太关心绘图的细节。

然而,我需要一个标题,一个图例和绘图上x轴和y轴的标签,既可以提醒自己什么是什么,也可以快速向其他人发送一些东西,而不必在电子邮件中添加“哦,顺便说一句,这次x轴是小时,y一如既往地是米,但蓝色现在是样本B…”行。

我想出了一个简单的方法(见下文),我也知道我可以用ax做各种强大的事情,但我花了一段时间才找到“简单”的解决方案,我远离ax,因为有太多我既不需要也不理解的事情在进行。

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

x和y标签不能作为参数添加到pd中有什么特殊原因吗。plot()?考虑到pd的额外简洁性。plot()overplt。plot()似乎应该使它更加简洁,而不必调用ax。设置标签()

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

为什么plt.plot()默认情况下包括图例,并且也很容易让我添加一个标题(my_df.plot(title='check out my tube')),但是逻辑上的下一步(my_df.plot(ytag='大小单位米'))导致TypeError:有没有Line2D属性"ytag"

我错过了什么吗?还是有什么原因导致了这种疏忽?

示例代码:

当我在真实文件中实现它并使用runworkflow运行它时,这就起作用了。py在ipython中,但我在复制粘贴代码时无法复制它。要么我的标签被忽略,要么它完全失败:

编辑:

最初我有plt。xlabel='time in seconds'在我的示例中,这不起作用,但我有正确的plt。xlabel(“以秒为单位的时间”)在我的真实代码中,这当然起作用了。

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')    #this works
#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
plt.ylabel('size in meters')
plt.xlabel('time in seconds')

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

axes = my_df.plot(title = 'just some random data')
axes.set_ylabel('size in meters')
axes.set_xlabel('time in seconds')

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

axes = my_df.plot()
axes.set_title('just some random data')
axes.set_ylabel('size in meters')
axes.set_xlabel('time in seconds')

共有2个答案

干浩然
2023-03-14

df.plot()返回轴对象的列表(每个子图一个)。它们有.set_xlabel().set_ylabel()方法。

这样做:

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

情节不是对象,相反,情节函数只创建Line对象。因为您可以在单个Axs对象中拥有多行,但只有一对标签,所以标签是轴的属性而不是行的属性是有意义的。

李洋
2023-03-14

首先,熊猫绘图命令没有特别的理由不包括标签的关键字参数,就像标题一样。
这个选项很可能被实现,但事实并非如此。猜测原因不会有任何结果,但熊猫问题跟踪器上有一个问题。

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

特别是ax.xlabel()不存在。plt.ylabel='大小单位米'也没有任何意义,因为它覆盖了ytag方法,而不是使用它。

工作选择:

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()
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()
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()
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()
 类似资料:
  • 所以我想在条形图中选择一个条形图,当我选择一个条形图时,它会改变条形图的颜色(我知道怎么做),但也会改变相应x轴标签的颜色。有没有办法做到这一点,如果有,谁能帮帮我吗?

  • 我想设置我的情节标题和x和y标签。总数都是浮点数64.我想尽可能简单地做这件事。 以下是我的代码部分:

  • 问题内容: 我正在使用以下代码(尝试)查询数据库: 其中clientRequest [0]来自字符串数组,服务变量是POJO中的字符串,映射到MySQL数据库中的VARCHAR(45)。 当我运行此代码时,Hibernate将执行的SQL查询显示为: 这使我相信clientRequest [0]的值未正确设置为参数。 我检查了clientRequest [0]包含一个有效的String,它确实这样

  • 我刚刚安装了Ubuntu desktop 12.04并通过以下方式安装了Java 6 JDK: 但是当我转到时,我没有看到一个名为的目录,所以我认为它根本不存在!?! 当我转到时,我看到: 我现在正试图将作为环境变量添加到中,以便从基于shell的Ant构建中访问它: ? ? 还有别的吗? 我所说的“”是指我在系统上安装的JDK6的顶级目录,无论它在哪里······

  • 问题内容: 我有一个JComboBox,其中的项目是查询的结果。该组合显示了来自查询的所有类别名称,对吗?好的,可以。现在,我需要为每个项目赋予一个值,该值就是产品的ID。 到目前为止,这是我得到的: 正如您在代码中看到的那样,每个项目的“标签”都是它的名称。现在,如何设置每个项目的ID,以便以后进行操作? 谢谢,并尝试轻松回答,我正尽最大努力尝试获取Java东西!哈! 问题答案: 默认情况下使用

  • 我有一个JComboBox,其中项目是查询的结果。组合显示了从查询中获取的所有类别名称,对吗?好的,它起作用了。现在我需要给每个项目一个值,这将是产品的ID。 这是我到目前为止得到的: 正如您在代码中看到的,每个项目的“标签”都是它的名称。现在,如何设置每个项目的ID,以便我可以操作之后? 谢谢,试着轻松回答,我很难得到这个Java的东西!哈!