将def用于matplotlib.pyplot-绘制了所有数据,而不是传递给def的数据

时间:2018-11-30 08:46:37

标签: python python-3.x pandas matplotlib

我创建了一个与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循环?)

非常感谢您的帮助!

1 个答案:

答案 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}}$')