我有多个站点的数据记录了受监控参数的急剧变化。如何使用依赖于值的颜色绘制所有这些网站的数据以增强可视化效果?
import numpy as np
import pandas as pd
import string
# site names
cols = string.ascii_uppercase
# number of days
ndays = 3
# index
index = pd.date_range('2018-05-01', periods=3*24*60, freq='T')
# simulated daily data
d1 = np.random.randn(len(index)//ndays, len(cols))
d2 = np.random.randn(len(index)//ndays, len(cols))+2
d3 = np.random.randn(len(index)//ndays, len(cols))-2
data=np.concatenate([d1, d2, d3])
# df = pd.DataFrame(data=data, index=index, columns=list(cols))
df.plot(legend=False)
在上面的代码中为每个站点(列)分配一种颜色。有没有办法将参数值表示为不同的颜色?
我猜一种方法是使用散点图函数中的colormaps选项:How to use colormaps to color plots of Pandas DataFrames
ax = plt.subplots(figsize=(12,6))
collection = [plt.scatter(range(len(df)), df[col], c=df[col], s=25, cmap=cmap, edgecolor='None') for col in df.columns]
但是,如果我随着时间的推移进行绘图(即x=df.index
),事情似乎无法按预期工作。
还有其他选择吗?或建议如何更好地想象时间序列中的突然变化?
答案 0 :(得分:2)
在下文中,我将仅使用3列和每小时数据,以使绘图看起来不那么杂乱。这些示例与原始数据一起使用。
cols = string.ascii_uppercase[:3]
ndays = 3
index = pd.date_range('2018-05-01', periods=3*24, freq='H')
# simulated daily data
d1 = np.random.randn(len(index)//ndays, len(cols))
d2 = np.random.randn(len(index)//ndays, len(cols))+2
d3 = np.random.randn(len(index)//ndays, len(cols))-2
data=np.concatenate([d1, d2, d3])
df = pd.DataFrame(data=data, index=index, columns=list(cols))
df.plot(legend=False)
由于长期存在bug,DataFrame.plot.scatter
不适用于类似日期时间的数据。
Matplotlib的scatter
可以处理类似日期时间的数据,但x轴不会按预期进行缩放。
for col in df.columns:
plt.scatter(df.index, df[col], c=df[col])
plt.gcf().autofmt_xdate()
这对我来说似乎是一个错误,但我找不到任何报告。您可以通过手动调整x限制来解决此问题。
for col in df.columns:
plt.scatter(df.index, df[col], c=df[col])
start, end = df.index[[0, -1]]
xmargin = (end - start) * plt.gca().margins()[0]
plt.xlim(start - xmargin, end + xmargin)
plt.gcf().autofmt_xdate()
不幸的是,x轴格式化程序不如pandas一样好。
我偶然发现了这个技巧,我不明白为什么会这样。如果您在调用matplotlib的scatter
之前绘制由相同日期时间数据编制索引的pandas系列,则自动调节问题将消失,您将获得漂亮的pandas格式。
所以我制作了第一列的无形图,然后是散点图。
df.iloc[:, 0].plot(lw=0) # invisible plot
for col in df.columns:
plt.scatter(df.index, df[col], c=df[col])