如何绘制含可变数量股票价格的DataFrame对数图?
问题描述
我有一个包含1-10只股票价格的DataFrame,需要将所有股票的价格绘制在同一个图表中,X轴为日期,Y轴为股价。要求代码能自动适配股票数量的变化(比如新增第4、5只股票),并且图表为对数图。
样本DataFrame生成代码与数据
生成代码
df = pd.DataFrame(all_Assets) df2 = df.transpose() print(df2)
输出的DataFrame数据
Close Close Close Date 2018-12-12 00:00:00-05:00 40.802803 24.440001 104.500526 2018-12-13 00:00:00-05:00 41.249191 25.119333 104.854965 2018-12-14 00:00:00-05:00 39.929325 24.380667 101.578560 2018-12-17 00:00:00-05:00 39.557732 23.228001 98.570381 2018-12-18 00:00:00-05:00 40.071678 22.468666 99.605057
无法正常运行的代码
fig = go.Figure(data=go.Scatter(df2, mode='lines'),)
解决方案
原代码无法运行的原因是go.Scatter不能直接接收整个DataFrame作为参数,需要为每只股票单独指定x(日期)和y(股价)数据。以下是两种能自动适配股票数量的实现方式:
方法一:Plotly Express(简洁推荐)
Plotly Express会自动遍历DataFrame的所有列生成折线,无需手动添加每条轨迹,新增股票时直接运行代码即可:
import plotly.express as px # 重命名重复的列名(可选,但图例更清晰) df2.columns = [f'股票{i+1}' for i in range(len(df2.columns))] # 绘制折线图,开启对数Y轴 fig = px.line(df2, x=df2.index, y=df2.columns, log_y=True) # 自定义布局 fig.update_layout( xaxis_title='日期', yaxis_title='股价(对数)', title='多只股票价格走势(对数图)' ) fig.show()
方法二:Plotly Graph Objects(自定义性更强)
通过循环遍历DataFrame的每一列,动态添加折线轨迹,适合需要更精细自定义图表的场景:
import plotly.graph_objects as go # 初始化图表对象 fig = go.Figure() # 遍历每一列,为每只股票添加折线 for idx, col in enumerate(df2.columns): fig.add_trace(go.Scatter( x=df2.index, y=df2[col], mode='lines', name=f'股票{idx+1}' # 设置折线对应的图例名称 )) # 开启对数Y轴并设置布局 fig.update_layout( xaxis_title='日期', yaxis_title='股价(对数)', title='多只股票价格走势(对数图)', yaxis_type='log' ) fig.show()
注意事项
如果DataFrame的列名重复(如示例中的多个Close),建议先重命名列,否则图例无法区分不同股票,导致图表可读性差。
内容的提问来源于stack exchange,提问作者Marc Kch
相关产品推荐
相关产品推荐

