You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:01:05