Настройка списков маркеров в hvplot - PullRequest
1 голос
/ 10 марта 2020

У меня есть набор данных, подобный:

df = pd.DataFrame(np.random.rand(10,2),columns=['A','B'])
df['group'] = np.random.choice(4,size=10)
df['category'] = np.random.choice(['CC','DD'],size=10)
df['sizes'] = np.random.randint(10,50,size=10)

, и я хочу получить график рассеяния A против B с маркерами, окрашенными столбцом 'group', и с типом маркеров, основанным на 'category' столбец, размер маркера на основе столбца «размеры».

Следующее ...

scatter = df.hvplot.scatter(x='A',y='B',color='group',padding=0.1,cmap='Set1',size='sizes')
scatter

... дает мне правильную раскраску, и пока я получаю "Невозможно объявить отображение для параметра «размер» (любая идея почему?) я на самом деле получаю правильный размер маркера.

Однако я не могу получить типы маркеров на основе столбца категории.

Я пытался ...

markers=['x' if zone=='DD' else 'o' for zone in df['category']]
scatter = df.hvplot.scatter(x='A',y='B',color='group',padding=0.1,cmap='Set1',size='sizes',marker=markers)
scatter

... но это преобразовать ВСЕ точки в крестики (x), а не в кружки (o).

Я также попытался добавить столбец:

df['markers'] = np.random.choice(['x','o'],size=10)

, а затем ...

scatter = df.hvplot.scatter(x='A',y='B',color='group',padding=0.1,cmap='Set1',size='sizes',marker='markers')
scatter

... но это выдает ошибку и не работает вообще.

Как правильно настроить маркеры для переменной с помощью hvplot?

Оцените ваши предложения.


РЕДАКТИРОВАТЬ 1: Теперь я также попытался использовать holoviews.dim, 1. с holoviews:

hvd = hv.Dataset(df,['A'],['B','markers'])
markers_custom = hv.dim('markers').apply(hvd)

hvd.to.scatter().opts(marker=marker)

, а затем 2. снова с помощью hvplot:

scatter = df.hvplot.scatter(x='A',y='B',marker=markers_custom)

Я получаю:

TypeError [Вызовите holoviews.i python .show_traceback () для подробностей] unhashable тип: 'numpy .ndarray'

... в обоих случаях.

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Вышесказанное работает, но мы очень рекомендуем не преобразовывать ваши фактические данные, если вам действительно не нужно, именно поэтому мы ввели так называемые dim выражения, которые вы можете прочитать о здесь . Они позволяют вам express сложное преобразование, не касаясь ваших данных, например, в вашем примере вы можете сделать:

import holoviews as hv

df = pd.DataFrame(np.random.rand(10,2),columns=['A','B'])
df['group'] = np.random.choice(4,size=10)
df['category'] = np.random.choice(['CC','DD'],size=10)
df['sizes'] = np.random.randint(10,50,size=10)
marker = hv.dim("category").categorize({'DD': 'x'}, default='circle')

df.hvplot.scatter(x='A',y='B', color="group", size="sizes", marker=marker)

Преобразование здесь в основном берет столбец категории и преобразует его, отображая все значения 'DD' в «х» и все другие значения в «круг».

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

У меня работает с пользовательским столбцом:

import numpy as np, pandas as pd, holoviews as hv, hvplot.pandas
hv.extension("bokeh")
np.random.seed(3)

df = pd.DataFrame(np.random.rand(10,2),columns=['A','B'])
df['group'] = np.random.choice(4,size=10)
df['category'] = np.random.choice(['CC','DD'],size=10)
df['sizes'] = np.random.randint(10,50,size=10)
df['marker'] = df.category.replace("DD","x").replace("CC","circle")

df.hvplot.scatter(x='A',y='B', color="group", size="sizes", marker="marker")

screenshot of plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...