我正在使用Python和Matplotlib编写一个Jupyter笔记本脚本,它应该通过yfinance
包获取指定股票的历史股票价格,并绘制每只股票的波动率与潜在回报。
预期的和实际的结果可以在here上找到。
正如您在第二个图像中看到的,股票代码的每个点旁边的注释完全缺失。我是Matplotlib的新手,所以我有点迷茫。使用的代码如下:
import yfinance as yf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from functools import reduce
from google.colab import files
sns.set()
directory = '/datasets/stocks/'
stocks = ['AAPL', 'MSFT', 'AMD', 'TWTR', 'TSLA']
#Download each stock's 6-month historical daily stock price and save to a .csv
df_list = list()
for ticker in stocks:
data = yf.download(ticker, group_by="Ticker", period='6mo')
df = pd.concat([data])
csv = df.to_csv()
with open(directory+ticker+'.csv', 'w') as f:
f.write(csv)
#Get the .csv filename as well as the full path to each file
ori_name = []
for stock in stocks:
ori_name.append(stock + '.csv')
stocks = [directory + s for s in ori_name]
dfs = [pd.read_csv(s)[['Date', 'Close']] for s in stocks]
data = reduce(lambda left,right: pd.merge(left,right,on='Date'), dfs).iloc[:, 1:]
returns = data.pct_change()
mean_daily_returns = returns.mean()
volatilities = returns.std()
combine = pd.DataFrame({'returns': mean_daily_returns * 252,
'volatility': volatilities * 252})
g = sns.jointplot("volatility", "returns", data=combine, kind="reg",height=7)
#Apply Annotations
for i in range(combine.shape[0]):
name = ori_name[i].replace(',csv', '')
x = combine.iloc[i, 1]
y = combine.iloc[i, 0]
print(name)
print(x, y)
print('\n')
plt.annotate(name, xy=(x,y))
plt.show()
打印出股票名称和我尝试放置注释的相应x,y位置将显示以下内容:
AAPL.csv
4.285630458382526 0.24836925418906455
MSFT.csv
3.3916453932738966 0.5159276490876817
AMD.csv
6.040090684498841 -0.002179408770566866
TWTR.csv
7.911518867192316 0.8556785016280568
TSLA.csv
9.154424353004579 -0.40596099327336554
除非我弄错了,否则这些就是在图表上绘制的确切的点。因此,我对为什么文本没有被正确注释感到困惑。我假设这与plt.annotate()
的xycoords
参数有关,但我对不同的坐标系知之甚少,无法知道应该使用哪个坐标系,或者这是否是问题的根本原因。
任何帮助都将不胜感激。谢谢!
发布于 2021-07-19 21:24:34
正如@JodyKlymak在他上面的评论中所说的那样,我的代码的问题源于包含几个子图的联合图,阻止了annotate()
知道文本放置基于哪个轴。这个问题很容易解决,只需用g.ax_joint.annotate()
替换plt.annotate()
即可。
https://stackoverflow.com/questions/68445932
复制