我创建了一个与pyplot一起使用的基本函数。
我有一个csv(UTF8)文件,每3秒记录一次不同文件系统的时间和可用内存统计信息。
这是我的文件结构:
time_seconds,filesystem_1_freemem,filesystem_2_freemem,filesystem_3_freemem
我正在尝试绘制freemem数据和其他文件系统数据以进行比较。
我有以下代码:
def draw_graph (input_file, x_axis, y_axis, label_color, label_name, graph_title):
fig = plt.figure()
ax = input_file.plot(kind="line")
plt.title(graph_title)
ax.set_xlabel("Time (seconds)")
ax.set_ylabel("freemem")
plt.ticklabel_format(style="plain", axis="y")
plt.show
当我使用以下参数调用此函数时,它将绘制 all 数据(filesystem_1_freemem,filesystem_2_freemem,filesystem_3_freemem),而不是 em 我正在传递数据的参数(filesystem_1_freemem ):
draw_graph(df, "time_seconds", "filesystem_1_freemem" , "Red", "filesystem_1_freemem","Filesystem 1 - Freemem Values")
很明显,我缺少一些东西,因此它可以打印CSV文件中的所有内容。我该如何纠正?
在那之后,作为改进,我如何修改代码,以便绘制给出的一个(或多个)参数? (假设参数是for循环?)
非常感谢您的帮助!
答案 0 :(得分:1)
您似乎将pandas
用作matplotlib
的“前端”。 pandas
df.plot.line()
方法在给定的DataFrame中绘制所有系列(列)。
此外,您将很多东西传递给函数,但是您从不使用任何参数。您的代码应该如何知道用于哪个原因的参数?有很多不错的教程,展示了如何在python中定义函数。
要解决当前的问题,可以尝试以下代码:
def draw_graph(input_file, x_axis, y_axis, label_color, label_name, graph_title):
fig = plt.figure()
ax = input_file.plot.line(x=x_axis, y=y_axis, color=label_color, label=label_name)
plt.title(graph_title)
ax.set_xlabel("Time (seconds)")
ax.set_ylabel(label_name)
plt.ticklabel_format(style="plain", axis="y")
plt.show
进一步的改进是:
def draw_graph (input_file, x_axis, y_axis, label_color, label_name, graph_title):
ax = input_file.plot.line(x=x_axis, y=y_axis, color=label_color, label=label_name)
plt.title(graph_title)
ax.set_xlabel("Time in seconds")
ax.set_ylabel(label_name)
ax.ticklabel_format(style="plain", axis="y")
简短说明:
熊猫已经自行创建了一个人物实例,因此无需使用fig = plt.figure()
创建第二个人物实例。但是您也可以创建自己的人物并将其实例通过以下方式传递给熊猫:
fig = plt.figure()
ax = fig.gca()
input_file.plot.line(ax=ax, ...)
plt.show
在大多数情况下是不需要的,具体取决于后端等。
图中所示的单位应不带大括号表示。最佳实践是用斜体字写 Time 和用罗马字写单位,例如ax.set_xlabel(r'$Time$ $in$ $\mathrm{s}$')
(使用TeX前端是最简单的解决方案,尽管看起来很麻烦)。< br />
更好的方法是将其与分数条而不是单词“ in”结合使用,例如:ax.set_xlabel(r'$\frac{Time}{\mathrm{s}}$')