2 回答
TA贡献1789条经验 获得超8个赞
优雅的解决方案是:
将DataFrame 中的Dates列设置为索引。
创建一个具有所需数量的子图(在您的情况下为 4)的图形,调用plt.subplots。
从 DataFrame 中绘制一个图,传递:
ax -子图的ax结果(这里是Axes对象的数组 ,而不是单个Axes),
subplots=True - 在单独的子图中绘制每一列。
执行此操作的代码是:
fig, a = plt.subplots(2, 2, figsize=(12, 6), tight_layout=True)
df.plot(ax=a, subplots=True, rot=60);
为了测试上面的代码,我创建了以下 DataFrame:
np.random.seed(1)
ind = pd.date_range('2005-01-01', '2006-12-31', freq='7D')
df = pd.DataFrame(np.random.rand(ind.size, 4),
index=ind, columns=['ES1', 'Z 1', 'VG1', 'NK1'])
并得到以下图片:
由于我的测试数据是随机的,我假设“7天”频率,以使图片不会太“混乱”。对于真实数据,请考虑使用“7D”频率和mean()聚合函数进行重采样。
TA贡献1856条经验 获得超5个赞
我认为更简洁的选择是不要制作许多数据帧,这会造成不必要的工作和复杂性。
绘制数据就是为绘图 API 塑造数据框
在这种情况下,更好的选择是使用 .dataframe 将宽格式转换为长(整齐)格式
.melt
。这会将所有标签放在一列中,并将值放在另一列中
使用,它可以从长格式的数据帧
seaborn.relplot
创建。FacetGrid
seaborn
是 的高级 APImatplotlib
,使绘图变得更加容易。
如果数据框包含许多股票,但只绘制少数股票,则可以使用布尔索引来选择它们
fig, a = plt.subplots(2, 2, figsize=(12, 6), tight_layout=True)
df.plot(ax=a, subplots=True, rot=60);
为了测试上面的代码,我创建了以下 DataFrame:
np.random.seed(1)
ind = pd.date_range('2005-01-01', '2006-12-31', freq='7D')
df = pd.DataFrame(np.random.rand(ind.size, 4),
index=ind, columns=['ES1', 'Z 1', 'VG1', 'NK1'])
并得到以下图片:
我在这里做错了什么?
当前的实现效率低下,有许多不正确的方法调用和未定义的变量。
如果需要,必须为每个子图显示图例。
Date
没有定义为x = Date
y2 = Notes
:Notes
未定义.line
不是plt
方法并导致AttributeError
; 它应该是plt.plot
y1 - y4
是 DataFrame,但传递给 y 轴的绘图方法,这会导致TypeError: unhashable type: 'numpy.ndarray'
; 一列应作为 传递y
。.legends
不是一种方法;它是.legend
fig, a = plt.subplots(2, 2, figsize=(12, 6), tight_layout=True)
df.plot(ax=a, subplots=True, rot=60);
为了测试上面的代码,我创建了以下 DataFrame:
np.random.seed(1)
ind = pd.date_range('2005-01-01', '2006-12-31', freq='7D')
df = pd.DataFrame(np.random.rand(ind.size, 4),
index=ind, columns=['ES1', 'Z 1', 'VG1', 'NK1'])
并得到以下图片:
添加回答
举报