Метки данных и оси X не совпадают - PullRequest
0 голосов
/ 18 февраля 2019

Попытка нанести значения оси 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)

IЯ думаю, что это что-то простое, я выглядел как форматер xAxis.Я попытался определить один, но ни один, кажется, не работает для моего варианта использования.Похоже, данные не связаны с xAxisLabel.Я ожидаю, что событие 1 будет отображаться на первом тике оси X, а событие 2 - на втором тике оси X.Событие 1 является правильным, но для каждого последующего события каждый тик по главной оси X пропускается с данными, находящимися между метками.

1 Ответ

0 голосов
/ 18 февраля 2019

Проблема в вашем коде состоит в том, что фактическое значение для x-координаты, которую вы предоставляете, равно:

nameAndId = ["Event2", 1]

Этот вид списка с именем категории и номером в списке понимается Bokehкак категорическое смещение .Вы явно указываете Bokeh расположить глиф на расстоянии 1 (в «синтетических» координатах) на расстоянии от местоположения «Event2».Причина, по которой все «работает» для случая Event1, заключается в том, что смещение в этом случае составляет 0:

nameAndId = ["Event1", 0]

Я не уверен, чего вы пытаетесь достичь, передавая эти списки со вторым числовым значением,поэтому я не могу предложить никаких дополнительных предложений, кроме как сказать, что их, вероятно, не следует передавать Боке.

...