我希望当y低于0时,此图表中的数据为红色,当高于0时,我希望绿色为绿色:
我正在尝试这个,但没有成功:
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()
我的数据如下:
+---+---------------------+------------+-----------+
| | 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()
答案 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()
答案 1 :(得分:0)
以下是使用不同数据集的示例,但总体而言应该能够轻松将其应用于您的数据。使用np.masked_where()将数据拆分为两个块然后绘制它。 t变量将帧定义为0.0到2.0,比例定义为0.01。
d_tag == DT_NULL