如何用Plotly绘制多只股票收益率分布并支持图例切换?
股票投资组合收益率分布可视化(支持图例切换)
解决方案说明
要在同一图中展示所有股票的收益率分布并支持图例切换,需直接使用Plotly的API构建图形,手动添加每只股票的直方图轨迹。Plotly默认支持点击图例隐藏/显示单条轨迹,满足交互需求。
完整代码实现
#Import libraries import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns import datetime as dt from pandas_datareader import data as pdr import plotly.graph_objects as go import plotly.offline as pyo pyo.init_notebook_mode(connected=True) pd.options.plotting.backend = 'plotly' #Set start/end time and get stocks data from Yahoo Finance end = dt.datetime.now() start = end - dt.timedelta(weeks=104) stocks_list = ['COST', 'NIO', 'AMD'] df = pdr.get_data_yahoo(stocks_list, start, end) #Rename 'Adj Close' to be able to create a more accessible variable df.rename(columns = {"Adj Close" : "Adj_Close"}, inplace = True) AClose = df.Adj_Close #Plot the Adjusted Close price with plotly AClose.plot() #-------------------------- # 所有股票简单收益率分布图 #-------------------------- # 计算所有股票的简单收益率 simple_returns = AClose.pct_change().dropna() # 创建Plotly图形对象 fig_simple = go.Figure() # 循环添加每只股票的直方图轨迹 for stock in stocks_list: fig_simple.add_trace(go.Histogram( x=simple_returns[stock], name=stock, opacity=0.6, # 设置透明度,方便查看重叠部分 nbinsx=50 # 调整直方图的 bin 数量 )) # 设置布局:直方图重叠显示,添加标题和标签 fig_simple.update_layout( title='股票投资组合简单收益率分布', xaxis_title='简单收益率', yaxis_title='频数', barmode='overlay' # 重叠模式,让多个直方图在同一图中显示 ) # 显示图形 fig_simple.show() #-------------------------- # 所有股票对数收益率分布图 #-------------------------- # 计算对数收益率 log_returns = np.log(df.Adj_Close/df.Adj_Close.shift(1)).dropna() # 创建Plotly图形对象 fig_log = go.Figure() # 循环添加每只股票的直方图轨迹 for stock in stocks_list: fig_log.add_trace(go.Histogram( x=log_returns[stock], name=stock, opacity=0.6, nbinsx=50 )) # 设置布局 fig_log.update_layout( title='股票投资组合对数收益率分布', xaxis_title='对数收益率', yaxis_title='频数', barmode='overlay' ) # 显示图形 fig_log.show()
功能说明
- 图例交互:点击图例中的股票名称,可单独隐藏/显示该股票的收益率分布轨迹,便于对比分析。
- 透明度设置:
opacity=0.6让重叠的直方图区域可见,避免完全遮挡。 - 重叠模式:
barmode='overlay'确保所有股票的直方图在同一坐标系展示,而非分成子图。
内容的提问来源于stack exchange,提问作者RiccardoWhc
相关产品推荐
相关产品推荐

