我有一个如下所示的数据框:
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 列。
无需为每一列单独手动声明,这是否可行?
要以编程方式为某些列分配颜色和标记,而无需为每一列手动声明,可以通过 matplotlib 的 cycler 和 pandas DataFrame.plot 的功能实现。以下是一个通用的方法:
matplotlib
cycler
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()
根据索引或列名分成两个组,如 group1 和 group2。
group1
group2
样式定义:
使用 cycler 定义颜色和标记的组合:
group1_style
group2_style
应用样式:
使用 plt.rc_context 将 cycler 样式设置为特定范围的列绘图。
plt.rc_context
线条样式:
'-'
'--'
'o'
'x'
这种方法无需手动为每列单独定义样式,能够动态适应不同的列数量。