Python+Bokeh绘制时序折线图遇轴反转及日期不显示问题求助
解决Pandas+Bokeh绘制时序折线图的两个问题:方向错误与X轴日期异常
一、核心问题根源
- 图表方向错误:大概率是日期列和酒吧数据的行列关系搞反了——应该把日期作为X轴(行索引或单独列),每家酒吧的到访数据作为单独列,而非反过来。
- X轴日期异常:日期数据是字符串格式,未转换成Pandas的
datetime类型,导致Bokeh无法识别为时间轴。
二、分步修正方案
1. 先处理数据格式(关键第一步)
假设你的数据导入后是类似结构,先做格式修正:
import pandas as pd # 替换成你的实际数据读取代码(比如pd.read_csv) data = { "日期": ["2019-01-01", "2019-02-01", "2020-01-01"], "酒吧A": [120, 150, 130], "酒吧B": [90, 110, 100], # ... 其余498家酒吧数据 } df = pd.DataFrame(data) # 强制转换日期列为datetime类型 df["日期"] = pd.to_datetime(df["日期"]) # 将日期设为索引,方便后续绘图 df = df.set_index("日期")
2. 修正Bokeh绘图代码,解决方向问题
错误通常出在遍历行/列或X/Y轴映射上,正确代码如下:
from bokeh.plotting import figure, show, output_file from bokeh.models import HoverTool # 设置输出文件(可选,Jupyter环境可省略) output_file("bar_visits.html") # 创建绘图对象,明确指定X轴为时间轴 p = figure( x_axis_type="datetime", title="5年酒吧到访时序图", x_axis_label="日期", y_axis_label="到访人数", width=1000, height=600 ) # 遍历每一家酒吧(DataFrame的列)绘制折线 for bar_name in df.columns: p.line( x=df.index, y=df[bar_name], legend_label=bar_name, line_width=2, line_alpha=0.6 # 加透明度,避免500条线重叠过密 ) # 添加悬停工具,方便查看具体数据 hover = HoverTool( tooltips=[ ("日期", "@x{%Y-%m-%d}"), ("到访人数", "@y"), ("酒吧", "$legend") ], formatters={"@x": "datetime"} ) p.add_tools(hover) # 优化图例交互,支持点击隐藏折线 p.legend.location = "top_left" p.legend.click_policy = "hide" # 显示图表 show(p)
3. 常见错误排查
- 若方向仍错误:执行
print(df.head())检查结构——日期应为行索引或首列,每家酒吧是单独列,如果数据是日期列在右侧、酒吧名在行内,用df.T转置数据即可。 - 若X轴仍不显示日期:执行
print(df.index.dtype)(日期为索引时)或print(df["日期"].dtype),确认输出为datetime64[ns];同时确保绘图时设置了x_axis_type="datetime"。
三、500家酒吧的优化建议
- 开启图例的
click_policy="hide"或"mute",方便用户筛选查看单家/部分酒吧 - 设置
line_alpha=0.6降低线条透明度,避免重叠过密 - 数据量极大时,可使用
ColumnDataSource批量加载数据,提升绘图性能
内容的提问来源于stack exchange,提问作者bellablot
相关产品推荐
相关产品推荐

