Создайте сетку графиков с помощью holoviews / hvplot и установите максимальное количество столбцов

Я хотел бы построить несколько данных в сетке с помощью holoviews / hvplot на основе одного измерения, которое содержит несколько уникальных точек данных.

Рассмотрим этот пример:

import seaborn as sns
import hvplot.pandas

iris = sns.load_dataset('iris')
plot = iris.hvplot.scatter(x="sepal_length", y="sepal_width", col="species")
hvplot.show(plot)

Приведенный выше код создает несколько графиков на основе части набора данных ириса о видах, в результате чего получается изображение ниже:
Пример сетки hvplot со слишком большим количеством столбцов

Но теперь представьте, что было не 3 разных вида, а двадцать. Сюжет станет слишком широким, поэтому я хотел бы прервать черту после нескольких сюжетов. Но я не нашел ни одного параметра "максимальное количество столбцов". Обычная сетка ожидает, что другой столбец определит строки, которых у меня нет.

Любые предложения помогут.


person MichaelA    schedule 07.01.2020    source источник


Ответы (2)


В вашем случае я бы не стал создавать сетку (используя ключевое слово 'row' и 'col'), но Layout.
Если у вас есть макет, вы можете легко настроить количество столбцов с помощью .cols (2).

Используя hvplot, вы должны использовать ключевое слово 'by' и 'subplots = True' вместо 'col'.

См. Код ниже:

iris.hvplot.scatter(
    x='sepal_length',
    y='sepal_width',
    by='species',
    subplots=True,
).cols(2)


Итоговый график:

создание макета для отображения графиков

person Sander van den Oord    schedule 08.01.2020
comment
Это определенно звучит сложнее, чем есть на самом деле - в любом случае, есть ли возможность сделать общую ось. .opts (shared_axes = True) у меня не работает - person MichaelA; 08.01.2020
comment
Какую версию hvplot и holoviews вы используете? Как вы можете видеть на моем изображении, мои оси являются общими и связаны, потому что имена оси Y и оси X одинаковы на всех графиках. Вы можете установить последнюю версию с помощью: stackoverflow.com/questions/59363729/ - person Sander van den Oord; 08.01.2020
comment
Что касается сложности: это хорошая вещь в hvplot, он все это делает за вас :) Так что вам нужно использовать меньше ниттигрита головокружений и боке. - person Sander van den Oord; 08.01.2020
comment
Боюсь, я не совсем точно ответил на свой вопрос. Мои оси также совпадают в отношении масштабирования, но я бы хотел подавить повторяющиеся метки y и x. (В моем реальном случае мои y-метки довольно длинные). Исходный подход col уже делает это, но я не могу найти решение для части сетки - person MichaelA; 08.01.2020
comment
Затем вам придется перебирать графики, чтобы удалить ylabel со всех графиков, кроме первого, что похоже на решение Джеймса Беднара: all_plots = []; для nr виды в enumerate (iris.species.unique ()): plot = iris [iris.species == sizes] .hvplot (kind = 'scatter', x = 'sepal_length', y = 'sepal_width', width = 400) если nr ›0: plot.opts (ylabel = '') all_plots.append (plot); hv.Layout (all_plots) .cols (2) - person Sander van den Oord; 08.01.2020

Объект HoloViews, возвращаемый приведенным выше вызовом, представляет собой GridSpace, который использует заголовки столбцов для указания значений по размерам внешней строки и столбца. Если бы вы разорвали линию в таком графике, заголовки столбцов перепутались бы, поэтому я почти уверен, что это никогда не сработает напрямую.

Даже в этом случае вы можете вытащить отдельные элементы в GridSpace и поместить их в макет HoloViews (который позволяет разрывать строки), если вы перемаркируете каждый график, чтобы вы знали значение по измерению видов:

import seaborn as sns, hvplot.pandas, holoviews as hv

iris = sns.load_dataset('iris')
plot = iris.hvplot.scatter(x="sepal_length", y="sepal_width", col="species")
p2   = hv.Layout([i.relabel(n).opts() for n,i in plot.items()]).cols(2)
hvplot.show(p2)

скриншот

person James A. Bednar    schedule 08.01.2020
comment
спасибо, Джеймс, так как вы частично виноваты в том, что выманили меня от чистого matplotlib, я очень признателен за то, что вы помогаете с первоначальной борьбой: D. В любом случае, есть ли причина, по которой вы вызываете .opts () в понимании списка. Это не кажется абсолютно необходимым - person MichaelA; 08.01.2020
comment
Хороший вопрос. Без этого графики были бы слишком большими для моего экрана, но я не знаю, почему только добавление .opts () повлияет на это. - person James A. Bednar; 09.01.2020
comment
В любом случае решение Сандера лучше моего; Мне нравится hvPlot, но я знаю HoloViews лучше, поэтому я возвращаюсь к решениям HoloViews, даже когда hvPlot уже позаботится об этом ... - person James A. Bednar; 09.01.2020