Как создать пузырьковую диаграмму с боке

Я хочу создать пузырьковую диаграмму с использованием Bokeh на основе категориальных осей x и y и использовать количество в качестве их размеров.

Вот фрейм данных, который у меня есть, и я успешно создал его с помощью Seaborn:

Как создать пузырьковую диаграмму с боке

Это краткая версия Seaborn, которую я создал

import pandas as pd
import seaborn as sns

d = {'T_range': ['0-50', '0-50', '0-50', '0-50',
                 '51-60', '51-60', '51-60', '51-60',
                 '61-70', '61-70', '61-70', '61-70'],
     'Subject': ['English', 'Maths', 'Chinese', 'Arts',
                 'English', 'Maths', 'Chinese', 'Arts',
                'English', 'Maths', 'Chinese', 'Arts'],
     'count': [603, 240, 188, 89,
               220, 118, 112, 43,
              123, 2342, 32, 212]}

df_test = pd.DataFrame(data=d)

sns.set(rc = {'figure.figsize':(15, 10)})
ax = sns.scatterplot(x='T_range', y='Subject', size='count', hue='Subject',
                    sizes=(100, 5000), legend=None, data=df_test)

display(df_test)

# Show result
ax


Я хотел бы знать, как добиться того же, используя боке. Заранее спасибо.


Решено

Спасибо откликнувшимся. Мне удалось создать график именно то, что я хотел. Я немного скорректировал его в соответствии с приложением следующим образом:

x = df[range_name].tolist()
y = df[group_name].tolist()
size = list(map(lambda i: i/10, df['count'].tolist()))

d = {'{}'.format(range_name): x,
     '{}'.format(group_name): y,
     'count': size}

пожалуйста, объясните «категориальные оси x и y», на самом вашем графике ось y («оценка») является числовой

Shijith 08.04.2019 09:12

@Shijith Мои извинения, я соответствующим образом исправил свой код. В основном, x и y категоричны. А 'count' содержит числовые данные для определения размеров.

N. Arunoprayoch 08.04.2019 09:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
2
2 361
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот как вы можете сделать то же самое в Bokeh v1.0.4. Запустите в Терминале, используя: python app.py

import pandas as pd
from bokeh.plotting import show, figure
from bokeh.models import ColumnDataSource, LinearColorMapper, ColorBar, BasicTicker, PrintfTickFormatter, HoverTool
from bokeh.palettes import Viridis256
from bokeh.transform import transform

scale = 10
d = {'T_range': ['0-50', '0-50', '0-50', '0-50',
                 '51-60', '51-60', '51-60', '51-60',
                 '61-70', '61-70', '61-70', '61-70'],
     'Subject': ['English', 'Maths', 'Chinese', 'Arts',
                 'English', 'Maths', 'Chinese', 'Arts',
                'English', 'Maths', 'Chinese', 'Arts'],
     'count': [603, 240, 188, 89,
               220, 118, 112, 43,
              123, 2342, 32, 212],
     'count_scaled': [603 / scale, 240 / scale, 188 / scale, 89 / scale,
           220 / scale, 118 / scale, 112 / scale, 43 / scale,
          123 / scale, 2342 / scale, 32 / scale, 212 / scale]}

df = pd.DataFrame(data = d)
source = ColumnDataSource(df)
p = figure(x_range = df['T_range'].unique(), y_range = df['Subject'].unique())

color_mapper = LinearColorMapper(palette = Viridis256, low = df['count'].min(), high = df['count'].max())
color_bar = ColorBar(color_mapper = color_mapper,
                     location = (0, 0),
                     ticker = BasicTicker())
p.add_layout(color_bar, 'right')
p.scatter(x = 'T_range', y = 'Subject', size = 'count_scaled', legend = None, fill_color = transform('count', color_mapper), source = source)
p.add_tools(HoverTool(tooltips = [('Count', '@count')]))
show(p)

Результат:

Большое спасибо, это именно то, что я искал. Я немного скорректировал его для своего приложения. Это работает отлично.

N. Arunoprayoch 08.04.2019 10:59

Можно ли добавить зависание для точного значения «количества» в каждом пузыре, сэр? Например, tooltips='$count'?

N. Arunoprayoch 08.04.2019 11:14

Я сделал это, сэр. всплывающие подсказки='@count'

N. Arunoprayoch 08.04.2019 11:34

Пожалуйста, найдите исправленный код (масштабирование должно применяться только к размеру круга, а не к ColorBar справа)

Tony 08.04.2019 11:40

size_scaled = list(map(lambda i: i/10, size)) Я создал это и добавил новый столбец, как было предложено. Все кажется хорошим. Еще раз спасибо.

N. Arunoprayoch 08.04.2019 11:58

Другие вопросы по теме