Общая ось диаграмм Holoviews при объединении и выводе

Я использую Holoviews для создания панели диаграмм. Некоторые из этих диаграмм имеют проценты по оси y, тогда как другие имеют суммы / числа и т. Д. Когда я пытаюсь вывести все диаграммы, которые я создал, в файл html, все диаграммы меняют свою ось y, чтобы соответствовать оси первой диаграммы. моего списка диаграмм.

Например:

  • График 1 представляет собой сумму, значения от 0 до 1000.
  • График 2 -%
  • График 3 -%

когда я объединяю эти диаграммы в головокружениях, используя:

  • Диаграммы = Диаграмма 1 + Диаграмма 2 + Диаграмма 3

Ось Y диаграмм 2 и 3 станет такой же, как у диаграммы 1.

Кто-нибудь знает, почему это происходит и как я могу это исправить, чтобы все диаграммы сохраняли свою индивидуальную ось, соответствующую тому, что они пытаются представить.

Спасибо!


person Amen_90    schedule 09.01.2020    source источник
comment
о, еще одна вещь. Если вы задаете новый вопрос о stackoverflow, попробуйте добавить пример кода, подобный тому, который я дал в своем ответе. Это действительно помогает разобраться в вашей конкретной проблеме.   -  person Sander van den Oord    schedule 09.01.2020


Ответы (3)


Это происходит, когда оси Y имеют одно и то же имя.
Вам нужно использовать опцию axiswise = True, если вы хотите, чтобы каждый график имел свою собственную независимую ось x и ось y.

В FAQ по holoviews есть краткая ссылка на осевое направление:
https://www.holoviews.org/FAQ.html

Вот пример кода, который я проверил и который работает:

# import libraries etc.
import numpy as np
import pandas as pd
import holoviews as hv
from holoviews import opts
hv.extension('bokeh')

# create some sample data
df1 = pd.DataFrame({
    'x': np.random.rand(10), 
    'y': np.random.rand(10),
})

df2 = pd.DataFrame({
    'x': np.random.rand(10) * 10, 
    'y': np.random.rand(10) * 10,
})

# set axiswise=True so that every plot gets its own independent x- and y-axis    
plot1 = hv.Scatter(df1).opts(axiswise=True)
plot2 = hv.Scatter(df2).opts(axiswise=True)

plot1 + plot2

Или, в качестве альтернативы, вы можете сделать:

plot1 = hv.Scatter(df1)
plot2 = hv.Scatter(df2)

(plot1 + plot2).opts(opts.Scatter(axiswise=True))


Если это не сработает, когда вы попробуете мой пример кода, возможно, вам придется обновить до последней версии holoviews. Это можно сделать следующим образом:
Установите последние версии git для holoviews, hvplot, panel, datashader и param

person Sander van den Oord    schedule 09.01.2020
comment
Привет, Сандер, мне просто интересно, знаете ли я, могу ли я сделать то же самое, если бы я использовал .plot для создания своих диаграмм головидения? - person Amen_90; 15.01.2020
comment
Ты пробовал? :) Вы действительно можете: (df1.plot.scatter (x = 'x', y = 'y') + df2.plot.scatter (x = 'x', y = 'y')). Opts (opts .Scatter (по оси = True)) - person Sander van den Oord; 15.01.2020
comment
Но, честно говоря, я сам скорее использую: import hvplot.pandas; а затем: (df1.hvplot.scatter (x = 'x', y = 'y') + df2.hvplot.scatter (x = 'x', y = 'y')). opts (opts.Scatter (axiswise = True)) Итак, вы используете .hvplot () вместо .plot (), что в основном то, что вы делаете, когда устанавливаете бэкэнд построения на головью. Вам действительно стоит проверить: hvplot.holoviz.org Hvplot - это то, что действительно используется. - person Sander van den Oord; 15.01.2020
comment
Большое спасибо, Сандер, это сработало! Да, обязательно буду! Я довольно далеко продвинулся в этом проекте, используя .plot! Это действительно здорово, потому что мне не нужно начинать более чем через несколько часов чистку и повороты, которые я уже сделал! знак равно - person Amen_90; 15.01.2020

Ответ Сандера верен и решит вашу конкретную проблему, но в этом случае он может не устранять основную причину. HoloViews связывает только одинаковые оси, и похоже, что вы наносите разные величины по оси Y на каждом графике. В этом случае реальное исправление состоит в том, чтобы ввести настоящее имя для оси y каждого графика, что отличает его от других вещей, которые вы, возможно, захотите нанести на ось y на каком-либо другом графике, который вы показываете. Тогда не только HoloViews больше не будет связывать оси ненадлежащим образом, но и зритель вашего сюжета сможет сказать, что каждый сюжет показывает разные вещи.

person James A. Bednar    schedule 10.01.2020
comment
Спасибо за ваш ответ! Небольшой дополнительный вопрос. Работает ли вышеперечисленное при работе с matplotlib с holoviews в качестве бэкэнда? Кажется, не удается заставить код работать в этом случае. - person Amen_90; 14.01.2020
comment
Да, это поведение должно быть одинаковым для всех библиотек построения графиков, поддерживаемых HoloViews. Если вы обнаружите проблему, создайте небольшой пример и отправьте сообщение о проблеме на github.com/holoviz/holoviews. - person James A. Bednar; 15.01.2020
comment
Привет, Джеймс. Спасибо за объяснение. Но такое поведение головокружения для меня не имеет смысла. Почему Holoviews определяет разделение оси на имя оси? Конечный пользователь может рисовать совершенно независимые цифры. но с такими же именами осей. Ось - связывание или совместное использование должно быть возможно только с дополнительным аргументом. Если я не оберну их в pn.row или pn.Column, я, кстати, не увидел никакой привязки осей. - person Enis Arik; 21.07.2020
comment
HoloViews - это библиотека высокого уровня, основанная на идее, что когда вы объявляете семантически релевантную информацию (например, метки измерений и единицы измерения для ваших данных), эта информация будет учитываться на протяжении всего процесса визуализации. - person James A. Bednar; 22.07.2020
comment
Таким образом, если вы создаете два графика, которые используют одни и те же оси, а затем помещаете их рядом друг с другом в один макет, HoloViews связывает две оси в предположении, что вы, должно быть, хотите сравнить данные на графике A с данными на графике B; иначе почему бы они были в одном макете? Вы всегда можете отключить автоматическое связывание, но библиотека разработана с учетом указанной вами информации. - person James A. Bednar; 22.07.2020

Я безуспешно пытался установить xlim и ylim, установить axiswise=True и многое другое.

В конечном итоге проблему решила установка your_layout.opts(shared_axes=False).

Дополнительные сведения см. здесь.

person Jurgen Strydom    schedule 10.05.2021