我有一个这样的数据框:
df=pd.DataFrame([[1.65, -0.05, 0],
[1.68, -0.01, 0],
[1.70, 0.01, 1],
[1.67, -0.02, 1],
[1.73 , 0.05, 1],
[1.67 , 0.01, 1],
[ 1.67, -0.02, 1],
[1.70 , 0.03, 0],
[ 1.66, -0.01, 0],
[ 1.69 ,-0.01 , 0]
])
df.rename(columns={1: "diff", 2: "label"},inplace=True)
df['label']=df['label'].astype(str)
print(df)
0 diff label
0 1.65 -0.05 0
1 1.68 -0.01 0
2 1.70 0.01 1
3 1.67 -0.02 1
4 1.73 0.05 1
5 1.67 0.01 1
6 1.67 -0.02 1
7 1.70 0.03 0
8 1.66 -0.01 0
9 1.69 -0.01 0
我想绘制第一列,并通过“标签”列为其赋予不同的颜色。
label = 1蓝色,label = 0红色
也就是说,一行中有两种颜色。
我使用以下代码进行绘制。
df.iloc[0:2,0].plot(y=df.columns[0],color='r', )
df.iloc[1:7,0].plot(y=df.columns[0],color='b' )
df.iloc[6:10,0].plot(y=df.columns[0],color='r' )
有更好的绘图方法吗?
实际上,实际数据有10000行
答案 0 :(得分:1)
从本质上讲,您正在尝试通过0
与数据集中相对于索引的先前值的相互作用来绘制其值。
我建议的解决方案是分别绘制每个数据点:
# First, create a new column for color
df['color'] = df['label'].map({0:'red',1:'blue'})
# Next, import & set up subplot
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1,1, figsize=(10,4))
# Iterate through rows
for idx, row in df[[0,'color']].iterrows():
v, c = row
# If you want a scatter plot
ax.scatter(idx, v, color=c)
if idx>0:
# If you want a line plot
ax.plot([idx-1,idx], [prev_v, v], color=c)
# Set the previous value
prev_v = v
# Add a legend
red_patch = mpatches.Patch(color='red', label='Losses')
blue_patch = mpatches.Patch(color='blue', label='Gains')
ax.legend(handles=[red_patch,blue_patch])
plt.show()
答案 1 :(得分:0)
您可能可以简化它,但作为一般解决方案,以下几行应有助于您抓取label为1或0的所有行:
# label == 1
df.iloc[df['label'].where(df['label'].astype(int) == 1).dropna().index].plot(y=df.columns[0], color='b')
# label == 0
df.iloc[df['label'].where(df['label'].astype(int) == 0).dropna().index].plot(y=df.columns[0], color='r')