Bokeh多行p

2024-10-01 13:34:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个图表上绘制RPI、CPI和CPIH,其中一个HoverTool显示了当您在图表的给定区域上平移时每个值的值。在

我最初尝试使用line()分别添加每一行,哪种方法有效:

enter image description here

但是,HoverTool只有在滚动到各个行时才能正常工作。在

我尝试过使用multi_line()例如:

combined_inflation_metrics = 'combined_inflation_metrics.csv'
df_combined_inflation_metrics = pd.read_csv(combined_inflation_metrics)
combined_source = ColumnDataSource(df_combined_inflation_metrics)


l.multi_line(xs=['Date','Date','Date'],ys=['RPI', 'CPI', 'CPIH'], source=combined_source)
#l.multi_line(xs=[['Date'],['Date'],['Date']],ys=[['RPI'], ['CPI'], ['CPIH']], source=combined_source)

show(l)

但是,这会引发以下问题:

^{pr2}$

但我不太清楚为什么会这样?在

更新:

我通过在每个数据源中添加所有值找到了一个解决方法。它是有效的,但感觉不是最有效的,而且仍然想知道如何正确地进行这项工作。在

编辑代码请求:

from bokeh.plotting import figure, output_file, show
from bokeh.models import NumeralTickFormatter, DatetimeTickFormatter, ColumnDataSource, HoverTool, CrosshairTool, SaveTool, PanTool
import pandas as pd
import os
os.chdir(r'path')

#output_file('Inflation.html', title='Inflation')

RPI = 'RPI.csv'
CPI = 'CPI.csv'
CPIH = 'CPIH.csv'

df_RPI = pd.read_csv(RPI)
df_CPI = pd.read_csv(CPI)
df_CPIH = pd.read_csv(CPIH)

def to_date_time(data_frame, data_series):
    data_frame[data_series] = data_frame[data_series].astype('datetime64[ns]')

to_date_time(df_RPI, 'Date')
to_date_time(df_CPI, 'Date')
to_date_time(df_CPIH, 'Date')

RPI_source = ColumnDataSource(df_RPI)
CPI_source = ColumnDataSource(df_CPI)
CPIH_source = ColumnDataSource(df_CPIH)

l = figure(title="Historic Inflaiton Metrics", logo=None)
l.plot_width = 1200


l.xaxis[0].formatter=DatetimeTickFormatter(
        days=["%d %B %Y"],
        months=["%d %B %Y"],
        years=["%d %B %Y"],
    )


glyph_1 = l.line('Date','RPI',source=RPI_source, legend='TYPE', color='red')
glyph_2 = l.line('Date','CPI',source=CPI_source, legend='TYPE', color='blue')
glyph_3 = l.line('Date','CPIH',source=CPIH_source, legend='TYPE', color='gold')


hover = HoverTool(renderers=[glyph_1],
                 tooltips=[     ("Date","@Date{%F}"),
                                ("RPI","@RPI"),
                                ("CPI","@CPI"),
                                ("CPIH","@CPIH")],
                          formatters={"Date": "datetime"},
                      mode='vline'
                 )
l.tools = [SaveTool(), PanTool(), hover, CrosshairTool()]

show(l)

Tags: csvsourcedfdatadatelinerpimetrics
1条回答
网友
1楼 · 发布于 2024-10-01 13:34:57

悬停工具查找要显示在ColumnDataSource中的数据。因为您为每一行创建了一个新的ColumnDataSource,并将hover工具限制为line1,因此它只能在数据源中查找数据。在

一般的解决方案是只创建一个ColumnDataSource并在每行中重用它:

df_RPI = pd.read_csv(RPI)
df_CPI = pd.read_csv(CPI)
df_CPIH = pd.read_csv(CPIH)

df = df_RPI.merge(dfd_CPI, on="date")
df = df.merge(df_CPIH, on="date")

source = ColumnDataSource(df)

l = figure(title="Historic Inflation Metrics", logo=None)

glyph_1 = l.line('Date','RPI',source=source, legend='RPI', color='red')
l.line('Date','CPI',source=source, legend='CPI', color='blue')
l.line('Date','CPIH',source=source, legend='CPIH', color='gold')

hover = HoverTool(renderers=[glyph_1],
                 tooltips=[     ("Date","@Date{%F}"),
                                ("RPI","@RPI"),
                                ("CPI","@CPI"),
                                ("CPIH","@CPIH")],
                          formatters={"Date": "datetime"},
                      mode='vline'
                 )

show(l)

当然,只有当所有的数据帧都可以合并成一个,即测量时间点是相同的,这才是可能的。如果他们不是除了重采样/插值,我不知道一个好的方法来做你想做的。在

相关问题 更多 >