首页 > 解决方案 > 用matplotlib绘制pandas数据框的分段折线图

问题描述

我想绘制由定义的水平轴值分割的数据框的折线图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()

我打算得到的东西如图所示。在此处输入图像描述

标签: pythonpython-3.xmatplotlib

解决方案


下面的呢?它应该适用于任意线段列表。让我们像你一样设置问题:

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')

这给了我下面的情节:

在此处输入图像描述


推荐阅读