如何通过其他列的值在一行中绘制两种颜色?

时间:2019-11-16 11:47:54

标签: python dataframe matplotlib

我有一个这样的数据框:

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行

2 个答案:

答案 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')