数据为负时的红线和Pandas中数据为正时的绿线

时间:2018-01-13 03:16:32

标签: python pandas matplotlib

我希望当y低于0时,此图表中的数据为红色,当高于0时,我希望绿色为绿色: profit

我正在尝试这个,但没有成功:

import pandas as pd
import matplotlib.pyplot as plt
import datetime
import seaborn as sns

sns.set(rc={"figure.figsize": (20, 10)})

df_positive = df[df["cum_profit"] > 0]["cum_profit"]
df_negative = df[df["cum_profit"] < 0]["cum_profit"]

plt.plot(df_positive, color='green')
plt.plot(df_negative, color='red')

plt.show()

neigh

我的数据如下:

+---+---------------------+------------+-----------+
|   |     placed_date     | cum_profit | cum_stake |
+---+---------------------+------------+-----------+
| 0 | 2017-07-14 16:06:38 | -25.0      |        25 |
| 1 | 2017-07-14 16:26:42 | -50.0      |        50 |
| 2 | 2017-07-14 16:54:53 | -75.0      |        75 |
| 3 | 2017-07-17 16:48:07 | -150.0     |       150 |
| 4 | 2017-07-17 18:52:22 | -200.0     |       200 |
| 5 | 2017-07-17 18:54:51 | 10.0       |       250 |
| 6 | 2017-07-17 18:59:19 | 190.0      |       300 |
| 7 | 2017-07-17 19:06:41 | 140.0      |       350 |
| 8 | 2017-07-17 19:42:42 | 90.0       |       400 |
| 9 | 2017-07-18 12:46:59 | 154.0      |       450 |
+---+---------------------+------------+-----------+

更新 最新尝试:

#df["positive"] = np.where(df["cum_profit"] > 0, df["cum_profit"], None)
#df["negative"] = np.where(df["cum_profit"] < 0, df["cum_profit"], None)

df.cum_profit.where(df.cum_profit.ge(0), np.nan).plot(color='green')
df.cum_profit.where(df.cum_profit.lt(0), np.nan).plot(color='red')

#plt.plot(df["positive"] , color='green')
#plt.plot(df["negative"], color='red')

plt.show()

enter image description here

2 个答案:

答案 0 :(得分:2)

您遇到的问题是matplotlib将绘制一条连接每个连续可绘制点的线。通过切割数据框,您仍然可以提供所有可绘制点,只需使用间隔开的索引。

要解决此问题,您可以在绘图操作中包含不可绘制的点。不使用切片,而是使用.where()并将填充值设为NaN

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

sns.set(rc={"figure.figsize": (20, 10)})

np.random.seed(200)
df = pd.DataFrame(np.cumsum(np.random.rand(10000)-0.5), columns=['cum_profit'])
df.cum_profit.where(df.cum_profit.ge(0), np.nan).plot(color='green')
df.cum_profit.where(df.cum_profit.lt(0), np.nan).plot(color='red')
plt.show()

enter image description here

答案 1 :(得分:0)

以下是使用不同数据集的示例,但总体而言应该能够轻松将其应用于您的数据。使用np.masked_where()将数据拆分为两个块然后绘制它。 t变量将帧定义为0.0到2.0,比例定义为0.01。

d_tag == DT_NULL

graph