数据和X轴标签未对齐

问题描述 投票:0回答:1

尝试在各自的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轴刻度,数据位于刻度线之间。

python-3.x bokeh figure
1个回答
1
投票

代码中的问题是您提供的x坐标的实际值是:

nameAndId = ["Event2", 1]

这种带有类别名称和列表中的数字的列表被Bokeh理解为categorical offset。您明确告诉Bokeh将字形定位为距离“Event2”的位置1(在“合成”坐标中)的距离。 Event1案例的“工作”原因是该情况下的偏移量为0:

nameAndId = ["Event1", 0]

我不确定你要通过传递带有第二个数值的这些列表来完成什么,所以我不能提供任何额外的建议,除非说它可能不应该传递给Bokeh。

© www.soinside.com 2019 - 2024. All rights reserved.