小能豆

用一种颜色绘制多列的panda数据框

py

我有一个如下所示的数据框:

                                 A  ...            B
datetime                            ...             
2020-01-01 00:00:00         10.622  ...           30
2020-01-01 01:00:00         16.397  ...           30
2020-01-01 02:00:00         24.190  ...           30
2020-01-01 03:00:00         33.579  ...           30
2020-01-01 04:00:00         44.643  ...           30
                            ...     ...           ...
2020-01-07 20:00:00         18.090  ...           30
2020-01-07 21:00:00         18.027  ...           30

当我使用 df.plot 时,所有列都使用默认颜色和实线绘制。我想用相同的颜色但不同的标记绘制 A 到 x 列,用另一种颜色和相同的标记绘制 x+1 到 B 列。

无需为每一列单独手动声明,这是否可行?


阅读 17

收藏
2024-12-12

共1个答案

小能豆

要以编程方式为某些列分配颜色和标记,而无需为每一列手动声明,可以通过 matplotlibcycler 和 pandas DataFrame.plot 的功能实现。以下是一个通用的方法:


代码实现

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from cycler import cycler

# 创建示例数据
dates = pd.date_range("2020-01-01", periods=48, freq="H")
data = np.random.rand(48, 5) * 50
columns = ['A', 'B', 'C', 'D', 'E']
df = pd.DataFrame(data, index=dates, columns=columns)

# 分组的列范围
group1 = df.columns[:3]  # 前3列
group2 = df.columns[3:]  # 其余列

# 设置颜色和标记
colors = ['red', 'blue']
markers = ['o', 'x']

# 设置循环器:为组1和组2定义样式
group1_style = cycler(color=[colors[0]] * len(group1)) + cycler(marker=markers[:len(group1)])
group2_style = cycler(color=[colors[1]] * len(group2)) + cycler(marker=markers[:len(group2)])

# 创建绘图
fig, ax = plt.subplots()

# 应用样式并绘制每组
with plt.rc_context({'axes.prop_cycle': group1_style}):
    df[group1].plot(ax=ax, style=['-'] * len(group1))  # 使用实线

with plt.rc_context({'axes.prop_cycle': group2_style}):
    df[group2].plot(ax=ax, style=['--'] * len(group2))  # 使用虚线

# 设置图例和显示
plt.legend()
plt.show()

代码逻辑

  1. 列分组
  2. 根据索引或列名分成两个组,如 group1group2

  3. 样式定义

  4. 使用 cycler 定义颜色和标记的组合:

    • group1_style:一个颜色、多个标记。
    • group2_style:另一种颜色、多个标记。
  5. 应用样式

  6. 使用 plt.rc_contextcycler 样式设置为特定范围的列绘图。

  7. 线条样式

  8. 实线('-')或虚线('--')用于区分组。

结果

  • 组 1:使用红色,列的标记为 'o''x' 等。
  • 组 2:使用蓝色,列的标记为 'o''x' 等。
  • 线条样式:每个组可以指定不同的线条样式(如实线或虚线)。

这种方法无需手动为每列单独定义样式,能够动态适应不同的列数量。

2024-12-12