Как заставить Plot.ly Python использовать заданный диапазон оси y?

Как вы можете видеть ниже, я вручную определяю диапазон для каждой оси y, а также устанавливаю для параметра autorange значение False.

Однако, если вы построите график, вы все равно обнаружите, что диапазон yaxis1 составляет от 0 до 20, а не от 0 до 25. В результате одна из полосок выступает за пределы диаграммы.

Как сделать так, чтобы я мог быть уверен, что каждое значение будет находиться в пределах диапазона оси y?

Изменить: Кроме того, верхняя линия сетки во второй строке не отображается. Если немного изменить масштаб, он появится снова. Так что проблема кажется чисто графической. Любые идеи приветствуются.

from plotly import tools
fig = tools.make_subplots(rows=2, cols=2, subplot_titles=['A', 'B'], shared_xaxes=False, shared_yaxes=True)

data = [[10, 4, 15, 20.5], [3, 12, 22.2], [6.5, 12, 26.2], [18, 4.2, 22.2]]
traces = [go.Bar(x=['Type A', 'Type B', 'Type C'], y=d) for d in data]

fig.append_trace(traces[0], 1, 1)
fig.append_trace(traces[1], 1, 2)
fig.append_trace(traces[2], 2, 1)
fig.append_trace(traces[3], 2, 2)

fig['layout']['yaxis1'].update(title='', range=[0, 25], autorange=False)
fig['layout']['yaxis2'].update(title='', range=[0, 30], autorange=False)

py.iplot(fig)

«Созданная


person AmourK    schedule 23.05.2018    source источник
comment
Возможно ли, что ось Y действительно идет на 25, но значение не отображается? Если вы добавите dtick=5 к yaxis1, также должно быть видно 25.   -  person Maximilian Peters    schedule 23.05.2018
comment
Это вполне могло быть так. Однако я делаю это как часть панели инструментов, которая будет обновляться в реальном времени на основе фильтров. И я не вижу очень надежного способа генерировать dtick значения для общей диаграммы. Спасибо!   -  person AmourK    schedule 23.05.2018
comment
@MaximilianPeters Прошу прощения, кажется, я украл ваш ответ, пожалуйста, опубликуйте свой ответ, я удалю свой, я только что просмотрел комментарии и заметил, что на него нет ответа, я не читал ваш комментарий, когда работал над проблема, еще раз извините!   -  person Naren Murali    schedule 31.05.2018
comment
@NarenMurali: Не беспокойтесь, все в порядке. Ваш ответ более подробный, чем мой комментарий. Вместо того, чтобы удалять свой ответ, просто добавьте ссылку.   -  person Maximilian Peters    schedule 31.05.2018
comment
@MaximilianPeters Спасибо, добавили!   -  person Naren Murali    schedule 31.05.2018


Ответы (1)


Итак, я попробовал ваш код и смог воспроизвести проблему.

Причина:

Причина этого в том, что если вы посмотрите на ось y в верхнем левом углу графика, вы увидите, что есть 3 значения [0, 10, 20], поэтому между каждым из значений существует разница в 10. поэтому, когда вы устанавливаете диапазон как [0, 25], разница в 10 не соблюдается, поэтому мы не можем видеть 25 в оси y.

Если мы посмотрим на график в левом нижнем углу оси x, мы увидим, что значение 30 подчиняется разнице 10 между каждым из значений. Таким образом, мы можем видеть 30 на оси y!

Решение:

Если вы посмотрите на документацию plotly, которую можно найти здесь, мы можем использовать конкретное свойство объекта yaxis для установки приращения между каждым из тиков, называемое dtick, графически определяет его как:

P.S: Личное спасибо Максимилиану Петерсу за помощь в поиске решения !!!!

dtick (числовая или категориальная строка координат)
Устанавливает шаг между отметками на этой оси. Используйте с tick0. Должно быть положительное число или специальные строки, доступные для осей «журнал» и «дата». Если ось type - "журнал", то деления устанавливаются каждые 10 ^ (n "dtick), где n - номер деления. Например, чтобы установить отметку деления на 1, 10, 100, 1000, ... установите dtick на 1. Чтобы установить отметки на 1, 100, 10000, ... установите dtick на 2. Чтобы установить отметки на 1, 5, 25, 125, 625, 3125, ... установите dtick на log_10 (5), или 0,69897000433. "log" имеет несколько специальных значений; "L", где f - положительное число, дает отметки, линейно разнесенные по значению (но не позиции). Например, tick0 = 0.1, dtick = "L0.5" будет ставить отметки при 0,1, 0,6, 1,1, 1,6 и т. д. Чтобы показать степень 10 плюс маленькие цифры между ними, используйте «D1» (все цифры) или «D2» (только 2 и 5). tick0 игнорируется для «D1» и «D2» . Если ось type - «дата», вы должны преобразовать время в миллисекунды. Например, чтобы установить интервал между отметками в один день, установите dtick на 86400000.0. «Дата» также имеет специальные значения. «M» дает интервалы между отметками. на количество месяцев. n должно быть положительным целым числом. Чтобы установить отметку 15 числа каждого третьего месяца, s et tick0 к "2000-01-15" и dtick к "M3". Чтобы установить отметку каждые 4 года, установите dtick на "M48".

Итак, когда мы установим dtick как 5, а диапазон [0,25], мы получим ожидаемый результат!

Пожалуйста, попробуйте приведенный ниже код и дайте мне знать, если ваша проблема полностью решена!

import pandas as pd
import plotly.offline as py_offline
import plotly.graph_objs as go
py_offline.init_notebook_mode()
from plotly import tools
fig = tools.make_subplots(rows=2, cols=2, subplot_titles=['A', 'B'], shared_xaxes=False, shared_yaxes=True)

data = [[10, 4, 15, 20.5], [3, 12, 22.2], [6.5, 12, 26.2], [18, 4.2, 22.2]]
traces = [go.Bar(x=['Type A', 'Type B', 'Type C'], y=d) for d in data]

fig.append_trace(traces[0], 1, 1)
fig.append_trace(traces[1], 1, 2)
fig.append_trace(traces[2], 2, 1)
fig.append_trace(traces[3], 2, 2)

fig['layout']['yaxis1'].update(title='', range=[0, 25], dtick=5, autorange=False)
fig['layout']['yaxis2'].update(title='', range=[0, 30], autorange=False)

py_offline.iplot(fig)
person Naren Murali    schedule 30.05.2018
comment
Я хочу автоматизировать создание графиков и не хочу указывать значение галочки, которое было бы хорошим числом. Вместо этого я хотел дать графику диапазон, который содержит, и пусть он выполняет всю работу за меня. Но я не думаю, что это возможно. В итоге я выбрал ваш метод. Спасибо! - person AmourK; 31.05.2018