Нарисуйте сегментированные линейные графики фрейма данных панд с помощью matplotlib - PullRequest
0 голосов
/ 13 февраля 2019

Я хотел нарисовать линейные графики фрейма данных, который сегментирован значениями горизонтальной оси, определяемыми line_segments_by_X.Любые идеи, как я могу сделать это с Matplotlib?

import pandas as pd
import matplotlib.pyplot as plt

line_segments_by_X = [(1,2), (3,4)]

data = {"X": list(x for x in range(5)), "V0": list(x for x in range(10, 15)),
    "V1": list(x for x in range(20, 25))}
df = pd.DataFrame(data, columns=["X", "V0", "V1"])

ax = plt.gca()
df.plot(kind='line', x='X', y="V0", ax=ax)
df.plot(kind='line', x='X', y="V1", ax=ax)
plt.show()

То, что я собираюсь получить, как на картинке.enter image description here

1 Ответ

0 голосов
/ 13 февраля 2019

Как насчет следующего?Это должно работать для произвольного списка отрезков.Давайте создадим задачу так, как вы это сделали:

import pandas as pd
import matplotlib.pyplot as plt

line_segments_by_X = [(1,2), (3,4)]

data = {"X": list(x for x in range(5)),
        "V0": list(x for x in range(10, 15)),
        "V1": list(x for x in range(20, 25))}
df = pd.DataFrame(data, columns=["X", "V0", "V1"])

Здесь я создаю фигуру и ось для построения графика, а затем зацикливаю каждый сегмент.

fig, ax = plt.subplots(1, 1)

for segment in line_segments_by_X:
    # Bool of values in segment
    bool = (df['X'] >= segment[0]) & (df['X'] <= segment[1])
    # Use bool to plot the lines in this segment
    ax.plot(df['X'][bool], df['V0'][bool], c='C0', label='V0')
    ax.plot(df['X'][bool], df['V1'][bool], c='C1', label='V1')

В цикле над сегментамиЯ фактически добавил каждый ярлык к легенде дважды.Давайте удостоверимся, что каждая метка встречается только один раз, и назовите вашу ось x:

handles, labels = ax.get_legend_handles_labels()
by_label = OrderedDict(zip(labels, handles))
ax.legend(by_label.values(), by_label.keys())

ax.set_xlabel('x')

Это дало мне график ниже:

enter image description here

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