Боке сюжет вернулся в функцию не рендеринг - PullRequest
0 голосов
/ 27 марта 2020

Я писал функцию, чтобы упростить мое построение, она еще не выдает никакой ошибки, когда я вызываю

show(plt)

для возвращаемого значения, ничего не происходит. Я работаю в тетради Jupyter. Я уже позвонил:

output_notebook()

Вот код функции:

def plot_dist(x, h, title, xl="X axis", yl="Y axis", categories=None, width=0.5, bottom=0, color="#DC143C", xmlo=None, ymlo=None, xlo=-18, ylo=5):
    total = np.sum(h)
    source = ColumnDataSource(data={
        "x":x,
        "h":h,
        "percentages":[str(round((x*100)/total, 2)) + "%" for x in h]
    })
    plt = figure(
        title=title,
        x_axis_label=xl,
        y_axis_label=yl
    )
    plt.vbar(
        x="x",
        width=width,
        bottom=bottom,
        top="h",
        source=source,
        color=color
    )
    if xmlo is None:
        if categories is None:
            raise ValueError("If no categories are provided xaxis.major_label_overrides must be defined")
        plt.xaxis.major_label_overrides = {
            int(x):("(" + str(c.left) + "-" + str(c.right) + "]") for x,c in enumerate(categories)
        }
    else:
        plt.xaxis.major_label_overrides = xmlo

    if ymlo is None:
        plt.yaxis.major_label_overrides = { int(x):(str(int(x)/1000)+"k") for x in range(0, h.max(), math.ceil((h.max()/len(h))) )}
    else:
        plt.yaxis.major_label_overrides = ymlo

    labels = LabelSet(
        x=str(x), y=str(h), text="percentages", level="glyph",
        x_offset=xlo, y_offset=ylo, source=source, render_mode="canvas"
    )
    plt.add_layout(labels)

    return plt   

И вот как он вызывается:

X = [x for x in range(0, len(grps.index))]
H = grps.to_numpy()
plt = plot_dist(X, H, "Test", "xtest", "ytest", grps.index.categories)

X - это просто список, а grps - результат вызова pandas 'DataFrame.groupby

Как я уже сказал, доза не дает никакой ошибки, поэтому я думаю, что проблема с ColumnDataSource объектом, я, должно быть, создаю его неправильно. Любая помощь приветствуется, спасибо!

Редактировать 1: По-видимому, удаление следующей строки решило проблему:

plt.add_layout(labels)

Сюжет теперь отображает корректность, но мне нужно добавить метки, есть идеи?

Редактировать 2: Хорошо, я решил проблему, осматривая веб-консоль при запуске кода, появляется следующая ошибка:

Error: attempted to retrieve property array for nonexistent field

Проблема была в следующие строки:

    labels = LabelSet(
        x=str(x), y=str(h), text="percentages", level="glyph",
        x_offset=xlo, y_offset=ylo, source=source, render_mode="canvas"
    )

В частности присвоить x=str(x) и y=str(h). Изменил его на просто x="x" и y="h" решил.

1 Ответ

1 голос
/ 29 марта 2020

Проблема с кодом связана с объявлением меток:

labels = LabelSet(
    x=str(x), y=str(h), text="percentages", level="glyph",
    x_offset=xlo, y_offset=ylo, source=source, render_mode="canvas"
)   

Обнаружено при проверке веб-консоли браузера, которая выдает следующую ошибку:

Error: attempted to retrieve property array for nonexistent field

Параметры x и y должны ссылаться на имена в объекте ColumnDataSource, передаваемые методу Glyph, используемому для рисования на графике.
Я ошибочно передавал str(x) и str(y), которые являются строковое представление содержимого. Я ошибочно предположил, что это будет относиться к строковому представлению переменной.
Для решения проблемы достаточно передать в качестве значений в параметры x и y конструктора LabelSet ключи словаря, используемые в ColumnDataSource конструктор:

labels = LabelSet(
    x="x", y="h", text="percentages", level="glyph",
    x_offset=xlo, y_offset=ylo, source=source, render_mode="canvas"
)   

Кроме того, если ColumnDataSource был создан из DataFrame, строки будут либо именами столбцов, либо строкой "index", если какие-либо данные используются в график ссылается на индекс, и у него нет явного имени или имени объекта индекса.

Большое спасибо bigreddot за помощь в решении проблемы и ответа.

...