Использование def для matplotlib.pyplot - выводятся все данные, а не то, что передается в def - PullRequest
0 голосов
/ 30 ноября 2018

Я создал базовую функцию для использования с pyplot.

У меня есть файл csv (UTF8), время и статистика свободной памяти регистрируются каждые 3 секунды для различных файловых систем.

Вот моя файловая структура:

time_seconds,filesystem_1_freemem,filesystem_2_freemem,filesystem_3_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

Когда я вызываю эту функцию со следующими аргументами, она извлекает все данные (filesystem_1_freemem, filesystem_2_freemem, filesystem_3_freemem), не аргумент, что я передаю его (filesystem_1_freemem):

draw_graph(df, "time_seconds", "filesystem_1_freemem" , "Red", "filesystem_1_freemem","Filesystem 1 - Freemem Values")

Очевидно, что я что-то упускаю, так что он отображает все, что находится в файле CSV.Как я могу исправить это?

После этого, как улучшение, как я могу пересмотреть код, чтобы он отображал один (или несколько) аргумент (ы), который ему дан?(предположим цикл for для аргументов?)

Большое спасибо за помощь!

1 Ответ

0 голосов
/ 30 ноября 2018

Похоже, вы используете pandas в качестве "внешнего интерфейса" для matplotlib.pandas df.plot.line() метод выводит все ряды (столбцы) в заданном фрейме данных.

Кроме того, вы передаете множество функций своей функции, но никогда не используете ни один из аргументов.Как ваш код должен знать, какой аргумент использовать для какой причины?Существует множество хороших руководств, показывающих, как определять функции в 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")

Краткое объяснение: Pandas уже создает экземпляр фигуры сам по себе, поэтому нет необходимости создавать второй экземпляр фигуры с 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 - это самое простое решение, даже если оно выглядит довольно громоздким).
ДажеЛучше объединить это с дробной чертой вместо слова «в», например, так: ax.set_xlabel(r'$\frac{Time}{\mathrm{s}}$')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...