数据和X轴标签未对齐

时间:2019-02-18 17:20:03

标签: python-3.x bokeh figure

尝试在各自的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轴刻度上,事件2显示在第二个X轴刻度上。事件1是正确的,但此后的每个事件都将跳过每个主要X轴刻度线,而数据位于刻度线之间。

1 个答案:

答案 0 :(得分:1)

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

nameAndId = ["Event2", 1]

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

nameAndId = ["Event1", 0]

我不确定您要通过将这些列表与第二个数值一起传递来完成什么工作,因此我不能提供任何其他建议,只是说它可能不应该传递给Bokeh。