python - 用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()
我打算得到的东西如图所示。
解决方案
下面的呢?它应该适用于任意线段列表。让我们像你一样设置问题:
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')
这给了我下面的情节:
推荐阅读
- php - Laravel Scout 不会导入记录 - Laravel 8
- python - p_mask=p_mask[span_idx].tolist(),AttributeError: - 'list' 对象没有属性 'tolist'
- c++ - 在 C++ 中查找最大数字
- javascript - MongoDB:从结果中返回动态字段
- amazon-web-services - 如何启动在 k8s 中的几个小型实例节点上运行的 pod?
- python - 输入和 if/else 语句未处理正确的输入
- javascript - 我不希望三级运算符中的 else 部分
- java - 在@XmlSchema 和@XmlRootElement 中使用外部值
- google-analytics - 谷歌分析与 Tableau 的连接
- database - Postgres 使用索引搜索 jsonb