如何在 Python 上使用 matplotlib 在价格走势图上标记 2 个特定数据点?
How to mark 2 specific data points on a price action chart using matplotlib on Python?
假设我有下图:
此类图表是使用以下 python 代码创建的:
from binance.client import Client
import pandas as pd
import matplotlib.pyplot as plt
#personal API key and Secret Key from your Binance account
api_key = "your binance api key"
secret_key = "your binance secret key"
client = Client(api_key= api_key, api_secret= secret_key, tld= "com")
klines_btcusdt = client.get_historical_klines(symbol="BTCUSDT", interval="1h", start_str = "1648807200000", end_str="1653667199999")
df_btcusdt = pd.DataFrame(klines_btcusdt)
#drop unnecesary columns
df_btcusdt.drop(5, inplace = True, axis=1)
df_btcusdt.drop(7, inplace = True, axis=1)
df_btcusdt.drop(8, inplace = True, axis=1)
df_btcusdt.drop(9, inplace = True, axis=1)
df_btcusdt.drop(10, inplace = True, axis=1)
df_btcusdt.drop(11, inplace = True, axis=1)
# Rename the column names for best practices
df_btcusdt.rename(columns = { 0 : 'Start Date',
1 : 'Open Price',
2 : 'High Price',
3 : 'Low Price',
4 :'Close Price',
6 :'End Date',
}, inplace = True)
# Convert Unix Time values to actual dates
df_btcusdt['Start Date'] = pd.to_datetime(df_btcusdt['Start Date'], unit='ms')
df_btcusdt['End Date'] = pd.to_datetime(df_btcusdt['End Date'], unit='ms')
df_btcusdt = df_btcusdt[['End Date','Close Price']]
df_btcusdt = df_btcusdt.set_index('End Date', inplace=False)
df_btcusdt = df_btcusdt.astype({'Close Price': 'float'})
#visualising the price
plt.figure(figsize=(8, 6), dpi=80)
plt.title('BTCUSDT Price')
plt.rc('xtick', labelsize = 8)
plt.plot(df_btcusdt.index[0:], df_btcusdt[0:])
我有兴趣标记 2 个特定数据点,它们是:df_btcusdt[0:1]
和 df_btcusdt[1024:1025]
,我的意思是:
Close Price
End Date
2022-04-01 05:59:59.999 44646.16
Close Price
End Date
2022-05-13 21:59:59.999 30046.65
但我不知道该怎么做,我尝试将代码的最后一行更改为以下代码:
plt.plot(df_btcusdt.index[0:], df_btcusdt[0:], markevery = [44646.16, 30046.65], marker="ro")
但是得到了:
ValueError: markevery=[44646.16, 30046.65] is iterable but not a valid numpy fancy index
它应该抛出这样的东西:
我可以得到一些帮助吗?
为简单起见,我们将数据帧称为df
。它有一个日期时间索引,所以诀窍是查找与您要突出显示的两个整数索引对应的日期,并将这些日期用于绘图。
要绘制线上方的点,可以使用 zorder
参数。
所以在线图命令之后,添加:
highlight_dates = df.index[[0, 1024]]
plt.scatter(highlight_dates, df.loc[highlight_dates, 'Close Price'],
color='red', marker='o', zorder=2.5)
假设我有下图:
此类图表是使用以下 python 代码创建的:
from binance.client import Client
import pandas as pd
import matplotlib.pyplot as plt
#personal API key and Secret Key from your Binance account
api_key = "your binance api key"
secret_key = "your binance secret key"
client = Client(api_key= api_key, api_secret= secret_key, tld= "com")
klines_btcusdt = client.get_historical_klines(symbol="BTCUSDT", interval="1h", start_str = "1648807200000", end_str="1653667199999")
df_btcusdt = pd.DataFrame(klines_btcusdt)
#drop unnecesary columns
df_btcusdt.drop(5, inplace = True, axis=1)
df_btcusdt.drop(7, inplace = True, axis=1)
df_btcusdt.drop(8, inplace = True, axis=1)
df_btcusdt.drop(9, inplace = True, axis=1)
df_btcusdt.drop(10, inplace = True, axis=1)
df_btcusdt.drop(11, inplace = True, axis=1)
# Rename the column names for best practices
df_btcusdt.rename(columns = { 0 : 'Start Date',
1 : 'Open Price',
2 : 'High Price',
3 : 'Low Price',
4 :'Close Price',
6 :'End Date',
}, inplace = True)
# Convert Unix Time values to actual dates
df_btcusdt['Start Date'] = pd.to_datetime(df_btcusdt['Start Date'], unit='ms')
df_btcusdt['End Date'] = pd.to_datetime(df_btcusdt['End Date'], unit='ms')
df_btcusdt = df_btcusdt[['End Date','Close Price']]
df_btcusdt = df_btcusdt.set_index('End Date', inplace=False)
df_btcusdt = df_btcusdt.astype({'Close Price': 'float'})
#visualising the price
plt.figure(figsize=(8, 6), dpi=80)
plt.title('BTCUSDT Price')
plt.rc('xtick', labelsize = 8)
plt.plot(df_btcusdt.index[0:], df_btcusdt[0:])
我有兴趣标记 2 个特定数据点,它们是:df_btcusdt[0:1]
和 df_btcusdt[1024:1025]
,我的意思是:
Close Price
End Date
2022-04-01 05:59:59.999 44646.16
Close Price
End Date
2022-05-13 21:59:59.999 30046.65
但我不知道该怎么做,我尝试将代码的最后一行更改为以下代码:
plt.plot(df_btcusdt.index[0:], df_btcusdt[0:], markevery = [44646.16, 30046.65], marker="ro")
但是得到了:
ValueError: markevery=[44646.16, 30046.65] is iterable but not a valid numpy fancy index
它应该抛出这样的东西:
我可以得到一些帮助吗?
为简单起见,我们将数据帧称为df
。它有一个日期时间索引,所以诀窍是查找与您要突出显示的两个整数索引对应的日期,并将这些日期用于绘图。
要绘制线上方的点,可以使用 zorder
参数。
所以在线图命令之后,添加:
highlight_dates = df.index[[0, 1024]]
plt.scatter(highlight_dates, df.loc[highlight_dates, 'Close Price'],
color='red', marker='o', zorder=2.5)