我有一个熊猫数据框(存储在excel中),其中包含一些组的时间序列。 我想为这些组绘制时间序列的线图。我无法把自己的头缠在pyplot中的掩蔽图上。我需要在冬季遮盖住地块(地块中的缝隙)。
我的出发点是此页面: https://matplotlib.org/gallery/lines_bars_and_markers/masked_demo.html
我看过有关熊猫面膜及其功能的文档。 我还看到了numpy.ma.masked_where函数文档。
我可以使用pandas.mask函数-但只能用于一列。我想不通一种使用['Months']列掩盖我的['Values']列的方法。
我尝试使用pandas.as_matrix()将两列导出到numpy。然后,我使用numpy.ma.masked_where屏蔽了['Values']。但是,当我尝试将其放回pandas数据框中时,它正在屏蔽,并且值仍然存在。
#Lets say I have a dataframe called df.
#It has following columns [['Date','Month', 'Values', 'GroupName']]
#This works, and the values seem to be masked, because they print as --
months = df['Month'].as_matrix()
values = df['Values'].as_matrix()
masked = np.ma.masked_where(months in ['5','6','7','8','9'], values)
#However this here unmasks the values =(
df['MaskedValues'] = masked
#This is how I do the plotting - I plot values from each group onto one plot
fig, ax = plt.subplots()
#Loops over groups and adds them to the plot
for key, group in df.groupby(['GroupName']):
ax = group.plot(ax=ax, kind='line', x='Date', y='MaskedValues', label=key, figsize=(40,15), fontsize=30, color='black')
我的最终目标是获得一条线图,在该线图中删除夏季以外的线。我希望情节有一个空白。
答案 0 :(得分:0)
我认为您需要
fig, ax = plt.subplots(figsize=(40, 15))
w = (10, 11, 12, 1, 2, 3, 4)
for key, group in df.groupby(['GroupName']):
group.mask(df.Month.isin(w)).plot(ax=ax, x='Date', y='Values', label=key, fontsize=30, color='black')
请注意,您不需要每次迭代都分配轴,并且figsize应该放在子图中。
我在这里给您一个mcve,这是两年来的一些正弦数据:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
t = pd.date_range('1.1.2000', '31.12.2001')
data = np.sin(np.arange(len(t.day))/10)
在相应的数据框中,添加了另外一列month
,该列将用于屏蔽:
df = pd.DataFrame({'value': data, 'month': t.month}, index=t)
(在我的示例中,游行已经在冬天结束了...:))
w = (10, 11, 12, 1, 2, 3)
然后,您可以通过以下方式绘制除month
在w
中的那些值以外的所有值:
df.value.mask(df.month.isin(w)).plot()
plt.show()