数据和 X 轴标签不对齐
Data and X axis labels not align
正在尝试在各自的 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 格式化程序。我试图定义一个,但 none 似乎适用于我的用例。数据似乎与 xAxisLabel 没有关联。我希望事件 1 在第一个 X 轴刻度上显示,而事件 2 在第二个 X 轴刻度上显示。事件 1 是正确的,但对于之后的每个事件,每个主要的 X 轴刻度都被跳过,数据位于刻度线之间。
您的代码中的问题是您提供的 x 坐标的实际值为:
nameAndId = ["Event2", 1]
这种在列表中有类别名称和数字的列表被Bokeh理解为categorical offset。您明确告诉 Bokeh 将字形定位在距 "Event2" 位置 1(在 "synthetic" 坐标中)away 的位置。 Event1 案例 "work" 的原因是该案例中的偏移量为 0:
nameAndId = ["Event1", 0]
我不确定您通过将这些列表与第二个数值一起传递来试图完成什么,所以我真的不能提供任何额外的建议,只能说它可能不应该传递给 Bokeh。
正在尝试在各自的 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 格式化程序。我试图定义一个,但 none 似乎适用于我的用例。数据似乎与 xAxisLabel 没有关联。我希望事件 1 在第一个 X 轴刻度上显示,而事件 2 在第二个 X 轴刻度上显示。事件 1 是正确的,但对于之后的每个事件,每个主要的 X 轴刻度都被跳过,数据位于刻度线之间。
您的代码中的问题是您提供的 x 坐标的实际值为:
nameAndId = ["Event2", 1]
这种在列表中有类别名称和数字的列表被Bokeh理解为categorical offset。您明确告诉 Bokeh 将字形定位在距 "Event2" 位置 1(在 "synthetic" 坐标中)away 的位置。 Event1 案例 "work" 的原因是该案例中的偏移量为 0:
nameAndId = ["Event1", 0]
我不确定您通过将这些列表与第二个数值一起传递来试图完成什么,所以我真的不能提供任何额外的建议,只能说它可能不应该传递给 Bokeh。