首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Matplotlib发布注释点

使用Matplotlib发布注释点
EN

Stack Overflow用户
提问于 2021-07-20 03:21:49
回答 1查看 32关注 0票数 0

我正在使用Python和Matplotlib编写一个Jupyter笔记本脚本,它应该通过yfinance包获取指定股票的历史股票价格,并绘制每只股票的波动率与潜在回报。

预期的和实际的结果可以在here上找到。

正如您在第二个图像中看到的,股票代码的每个点旁边的注释完全缺失。我是Matplotlib的新手,所以我有点迷茫。使用的代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
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位置将显示以下内容:

代码语言:javascript
代码运行次数:0
运行
复制
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参数有关,但我对不同的坐标系知之甚少,无法知道应该使用哪个坐标系,或者这是否是问题的根本原因。

任何帮助都将不胜感激。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-07-20 05:24:34

正如@JodyKlymak在他上面的评论中所说的那样,我的代码的问题源于包含几个子图的联合图,阻止了annotate()知道文本放置基于哪个轴。这个问题很容易解决,只需用g.ax_joint.annotate()替换plt.annotate()即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68445932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档