尝试在各自的x轴上绘制X轴(事件)值。 Y轴是相对于时间(当天)事件持续的时间和持续时间。绘制的第一个标签和数据是正确的。然而,第二组数据似乎跳过主要的x轴刻度并且在之后但在下一个主要x轴刻度之前放置。对于绘制的每个附加x轴值重复此过程。数据没有显示出现在哪个X轴上的问题。
定义数据(源)并可以用大约50行代码绘制问题。
from bokeh.io import output_file
from bokeh.models import ColumnDataSource, LabelSet
from bokeh.plotting import figure, show
from bokeh.models.formatters import NumeralTickFormatter
import pandas as pd
import math
output_file("events.html", mode="inline")
x1 = []
y1 = []
x2 = []
y2 = []
colorList = []
shortNames = []
nameAndId = ["Event1", 0]
x1.append(nameAndId)
y1.append(33470)
x2.append(nameAndId)
y2.append(33492)
colorList.append("red")
shortNames.append("Evt1")
nameAndId = ["Event2", 1]
x1.append(nameAndId)
y1.append(34116)
x2.append(nameAndId)
y2.append(34151)
colorList.append("green")
shortNames.append("Evt2")
xAxisLabels = ["Event1", "Event2"]
data = {"x1": x1, "y1": y1, "x2": x2, "y2": y2, "color": colorList,\
"shortName": shortNames}
eventDF = pd.DataFrame(data=data,
columns=("x1", "y1", "x2", "y2", "color",\
"shortName"))
source = ColumnDataSource(eventDF)
yRange = [34151, 33470]
p = figure(plot_width=700, plot_height=750, x_range=xAxisLabels,\
y_range=yRange, output_backend="webgl")
p.xaxis.major_label_orientation = math.pi / -2
p.segment(x0="x1",y0="y1",x1="x2",y1="y2", source=source, color="color"\
line_width=12)
p.yaxis[0].formatter = NumeralTickFormatter(format="00:00:00")
p.xaxis.axis_label = "Events"
labels = LabelSet(x="x2",y="y2", text="shortName", text_font_size="8pt"\
text_color="black", level="glyph", x_offset=-6,\
y_offset=-5, render_mode="canvas", angle=270,\
angle_units="deg", source=source)
p.add_layout(labels)
show(p)
我认为这很简单,我看起来像是一个xAxis格式化程序。我试图定义一个,但似乎没有一个适用于我的用例。数据似乎与xAxisLabel无关。我期待事件1显示在第一个X轴上,在第二个X轴上打勾事件2。事件1是正确的但是对于之后的每个事件,跳过每个主要的X轴刻度,数据位于刻度线之间。
代码中的问题是您提供的x坐标的实际值是:
nameAndId = ["Event2", 1]
这种带有类别名称和列表中的数字的列表被Bokeh理解为categorical offset。您明确告诉Bokeh将字形定位为距离“Event2”的位置1(在“合成”坐标中)的距离。 Event1案例的“工作”原因是该情况下的偏移量为0:
nameAndId = ["Event1", 0]
我不确定你要通过传递带有第二个数值的这些列表来完成什么,所以我不能提供任何额外的建议,除非说它可能不应该传递给Bokeh。