Каким должен быть виджет обратного звонка — чек-лист для оценки эффективности
На сайт →Виджет обратного звонка есть на большинстве сайтов компаний: клиент нажимает на виджет, вводит свой номер телефона, сервис автоматически набирает этот номер и соединяет клиента с оператором — просто и удобно.
Рассказываем о 5 признаках виджета, который работает и не раздражает.
1. Находится на правильном месте
Кнопка обратного звонка не должна перекрывать информацию на сайте. Лучше всего делать виджеты не очень крупными и на полях, где нет текста. Еще один вариант — закреплять их в меню, там, где указан номер телефона компании.
2. Появляется через 15–20 секунд
Не нужно предлагать пользователю звонить вам до того, как он о вас что-то узнал. Виджет, который всплывает на экране сразу после открытия сайта, может создать впечатление, что вы навязываете свои услуги.
Дайте пользователю время освоиться и составить о вас хотя бы первое впечатление. Идеально показывать виджет людям, которые провели на сайте хотя бы 15–20 секунд.
3. Заметный, но не режет глаз
Виджет не должен сливаться с картинками сайта, но и не должен раздражать. Ярко-красный пляшущий виджет посреди экрана — то же самое, что баннерная всплывающая реклама на вашем любимом сайте: очень сильно бесит.
Определите главный цвет сайта и подберите под него цвет кнопки на пару тонов темнее или светлее. Секрет успеха виджета — не в заметности, а в уместности.
4. Не отвлекает
Лет 15 назад сайты сами по себе были развлечением: открываешь страницу, а тебе в уши — музыка, в глаза — прыгающие буквы. Сейчас такое ретро скорее отпугнет пользователей, ведь все уже привыкли к более лаконичным формам.
Кнопка виджета не должна мигать, прыгать или вибрировать. Хотите привлечь внимание — лучше сделайте человеческий текст на форме: недлинный, понятный и простой.
5. Два поля в форме — максимум
Пользователю достаточно оставить номер телефона и свое имя. Не нужно заставлять его рассказывать о возникшем вопросе, городе или о том, откуда он о вас узнал. Выяснять это — работа менеджера.
Подключить функцию обратного звонка можно бесплатно с Облачной АТС от Билайн. Если у вас всё уже настроено и даже виджет выглядит здорово, а клиентов всё нет — почитайте, где их искать и как правильно вкладываться в интернет-рекламу.
Поможем подобрать эффективные инструменты для вашего бизнеса. Оставьте заявку, и наши специалисты проведут бесплатную консультацию.
Информация, изложенная в настоящем разделе, отражает личную позицию автора, не является официальной позицией ПАО «ВымпелКом», не основана на официальных документах ПАО «ВымпелКом» и может содержать сведения, не подтвержденные Обществом. Запросы о предоставлении официальной позиции Вы можете направить по: [email protected]
#продажи#короче
Статьи Статья по теме #продажи, #короче
Добавление виджетов обратной связи
Добавление виджетов обратной связи
На Тильде есть собственные виджеты обратной связи и интеграция со сторонними сервисами.
Собственные виджеты Тильды расположены в категориях «Форма» и «Кнопка».
Внешний вид виджетов меняется в настройках блока. Вы можете задать цвет фона, цвет иконки и добавить анимацию. Также можно изменить типографику и отступы элемента.
Расположение (в какой части экрана будет размещен ваш виджет) можно настроить только для настольных компьютеров (разрешение от 980px и выше). Для мобильных устройств (разрешения от 0 до 980px) виджет будет зафиксирован в правой нижней части экрана.
Чтобы получить данные из виджета (телефон, email или сообщение), нужно подключить сервисы приема данных.
Как подключить формы приема данных
Виджет для заказа обратного звонка
При просмотре на мобильном, нажатие на кнопку вызывает функцию звонка. В версии для компьютеров — открывает форму, в которой можно оставить телефон для связи.Добавьте на страницу блок BF901 (Библиотека блоков > Форма > Виджет для заказа обратного звонка)
В версии для компьютеров клик по кнопке открывает форму, в которой можно оставить номер телефона и таким образом заказать звонок.Чтобы информация отправилась в сервис приема данных, в меню «Контент» отметьте галочкой подключенный сервис.
В мобильной версии клик по кнопке активирует функцию звонка в телефоне.Чтобы функция сработала, необходимо заполнить поле «телефон».
Также вы можете добавить призыв к действию рядом с круглой кнопкой. Рекомендуемая длина фразы — два-три слова.
Виджет для отправки сообщений
Клик на кнопку открывает форму, в которой можно написать сообщение и оставить email и имя.Перейдите в ваш проект на Тильде и добавьте на страницу блок BF902N (Библиотека блоков > Форма > Виджет для отправки сообщений)
После этого необходимо подключить сервис приема данных , а затем в меню «Контент» блока виджета, установить галочку напротив подключенного сервиса.
Сохраните изменения и опубликуйте страницу.
Виджет с формой подписки
Клик на кнопку открывает форму, в которой можно оставить email.Добавьте на страницу блок BF903 (Библиотека блоков > Форма > Виджет с формой подписки)
Подключите сервис приема данных, который будет собирать email пользователей, подписавшихся на вашу рассылку. Затем в настройках блока установите галочку напротив подключенного сервиса.
Сохраните изменения и опубликуйте страницу.
Виджет с номером телефона
Клик на кнопку открывает окно, в котором указана персональная информация и номер телефона. Данный виджет подойдет для личных сайтов, сайта конкретного специалиста и т. п.Добавьте на страницу блок BF904 (Библиотека блоков > Кнопка > Виджет с номером телефона)
В меню «Контент» укажите номер телефона и добавьте дополнительную информацию о том, кому посетитель сайта будет звонить.
Виджет с мессенджерами
Клик на кнопку открывает окно с ссылками на социальные сети, по которым посетитель сайта может перейти.Добавьте на страницу блок BF905 или BF905A (Библиотека блоков > Кнопка > Виджет с формой подписки). Блоки отличаются по дизайну, но остальные настройки одинаковые.
В меню «Контент» у блока с виджетом задайте заголовок, описание, текст рядом с виджетом, и ссылки на нужные социальные сети. Значки соцсетей отобразятся автоматически после добавления ссылки.
Добавьте необходимую информацию. Сохраните изменения и опубликуйте страницу.
Так же в Тильду могут быть добавлены сторонние сервисы обратной связи с помощью блока T123 «HTML-код»
Сервисы и виджеты для сайта — прокачай Тильду!
Вставка HTML кода
Порядок отображения виджетов при использовании обратных вызовов — 🎈 Использование Streamlit
philipnye 1
Я сделал очень простое приложение, которое:
- Использует виджет загрузки файлов для чтения в файле Excel
- Дает пользователю возможность выбрать рабочий лист, который ему интересен для предварительного просмотра, с помощью раскрывающегося списка.
- Отображает предварительный просмотр рабочего листа
Я использую обратный вызов из st. selectbox
для отображения предварительного просмотра, чтобы он отображался только после того, как пользователь активно выбрал интересующий его лист. там, где я хочу, под этими виджетами.
Это мой код (Streamlit 1.3.1) и скриншот моего вывода.
импортировать поток как st импортировать панд как pd # СОЗДАТЬ ПРИЛОЖЕНИЕ # Добавить файл_загрузчик загруженный_файл = st.file_uploader( label='Загрузить файл', type=['xls', 'xlsx', 'xlsm'], ключ = 'загрузчик файлов', помощь = ''' Загрузите файл Excel. Файл должен быть закрыто, чтобы вы могли его загрузить. ''' ) # Определите функцию, которая загружает предварительный просмотр листа защита load_sheet_preview(): st.dataframe(df[st.session_state.selectbox_sheet]) # Добавить поле выбора если uploaded_file не None: df = pd.read_excel(uploaded_file, sheet_name=None) # sheet_name=None не требует явного включения - это не значение по умолчанию # noqa: E501 ул.селектбокс( ключ = 'selectbox_sheet', label='Выберите рабочий лист', опции=df. keys(), on_change=load_sheet_preview )
Capture1920×1079 77,3 КБ
Подозреваю, что буду пинать себя, когда услышу решение, но не могу придумать, как это обойти. Оборачивая код, создающий загрузчик файлов и поле выбора, в функции, упорядоченные в том порядке, в котором я хочу, чтобы они отображались в приложении, этого не происходит.Спасибо.
Райанлэмпкин 2
при обратном вызове функция load_sheet_preview
, вы пишете на страницу с st.dataframe
. Поскольку функция обратного вызова записывается на страницу перед чем-либо еще во время перезагрузки Streamlit, это означает, что кадр данных записывается на страницу до перехода к , если uploaded_file не равен None:
.
Мне нужно еще немного подумать над решением, но, возможно, это поможет вам добраться до него первым.
филиппинские 3
Спасибо, Райан.
Да, думаю, правильно. Я не могу понять, как изменить свой код, чтобы обойти эту проблему — я не могу переместиться туда, где определена функция, и я не уверен, какие еще изменения я могу внести в свой код. Если есть идеи, буду очень признателен!
апассия 5
st.container выглядит как способ определить, где что находится, но отложить загрузку:
st.container — Streamlit Docs
Я не пробовал, но использую аналогичную концепцию со столбцами — я определю столбцы, но заполню их после того, как запущу другой код.
филиппинские 6
Спасибо, Альберт.
Я попробовал это двумя способами. Включение кода, который отображает предварительный просмотр в контейнере, приводит к ошибке «Неверный формат сообщения» («setIn» не может быть вызван на ElementNode»). Я думаю, что это может быть связано с поднятыми здесь вопросами — обратные вызовы не предназначены для изменения отображения приложения.
Включение элементов file_uploader
и selectbox
в контейнер вместо этого не дает ошибки, но порядок элементов остается прежним (т.е. предварительный просмотр над другими элементами), предположительно потому, что функции оцениваются в первую очередь.
Рад поделиться своим кодом на любом из них, если кто-то захочет его увидеть.
Я придумал другой обходной путь, который я опубликую ниже.
филиппинские 7
Я придумал решение этой проблемы, которое включает (явно) использование st.session_state
вместо обратного вызова и добавление значения по умолчанию в раскрывающиеся параметры. Предварительный просмотр не загружается, пока выбран параметр по умолчанию.
#!/usr/bin/env Python # -*- кодировка: utf-8 -*- импорт io импортировать панд как pd импортировать Streamlit как st # СОЗДАТЬ ПРИЛОЖЕНИЕ # Добавить файл_загрузчик загруженный_файл = st.file_uploader( label='Загрузить файл', type=['xls', 'xlsx', 'xlsm'], ключ = 'загрузчик файлов', помощь = ''' Загрузите файл Excel. Файл должен быть закрыто, чтобы вы могли его загрузить. ''' ) # Добавить поле выбора если 'selectbox_sheet' не находится в st.session_state: # Инициализировать переменную st.session_state['selectbox_sheet'] = '--' если uploaded_file не None: Sheets_dict = pd.read_excel(uploaded_file, sheet_name=None) # Это создает словарь фреймов данных. sheet_name=Ничего не требует явного включения - это не значение по умолчанию # noqa: E501 default_option = {'--': ''} selectbox_options = dict(**default_option, **sheets_dict) # Объединение словарей # noqa: E501 ул.селектбокс( ключ = 'selectbox_sheet', label='Выберите рабочий лист', опции = selectbox_options.keys () ) # Загрузить предварительный просмотр листа если st.session_state.selectbox_sheet != '--': st.dataframe(sheets_dict[st.session_state.selectbox_sheet])
Если есть более элегантное решение, мне все равно было бы интересно его услышать — я бы подумал, что можно что-то сделать с помощью st.container()
.
система Закрыто 8
Эта тема была автоматически закрыта через 365 дней после последнего ответа. Новые ответы больше не допускаются.
Как подключить два выбранных виджета к функции обратного вызова с боке? — Поддержка сообщества
Гайка 1
У меня есть график, определенный так, где fetch_data(x,y)
возвращает dict из кадра данных из указанных столбцов, а также имена видов.
источник = ColumnDataSource (fetch_data ('body_wt', 'беременность')) p = Figure(x_axis_type='log',y_axis_type='log',tooltips=[('species', '@species'),('xs', '@xs'),('ys', '@ys')],title='DVA: Инспектор данных о сне млекопитающих') p.xaxis.axis_label = 'body_wt' p.yaxis.axis_label = 'беременность' p.circle('xs', 'ys', источник=источник) показать (п)
Здесь я хочу иметь функцию обратного вызова, которая должна обновлять ColumnDataSource и метки осей на основе виджетов Select
.
обратный вызов по определению (select_xaxis:str,select_yaxis:str): источник = ColumnDataSource (fetch_data (select_xaxis, select_yaxis)) p.xaxis.axis_label = select_xaxis p.yaxis.axis_label = select_yaxis проходить select_xaxis = Select (title = 'Переменная оси X', значение = 'body_wt', options=['хищничество','воздействие','опасность','body_wt','brain_wt','non_dreaming','dreaming','total_sleep','life_span','gestation']) select_yaxis = Select (title = 'Переменная оси Y', значение = 'беременность', options=['хищничество','воздействие','опасность','body_wt','brain_wt','non_dreaming','dreaming','total_sleep','life_span','gestation']) select_xaxis.js_on_change('value',CustomJS(args=dict(source=callback(select_xaxis.value,select_yaxis.value)))) select_yaxis.js_on_change('value',CustomJS(args=dict(source=callback(select_xaxis.value,select_yaxis.value)))) lt = макет (столбец (select_xaxis, select_yaxis), p) показать (л)
Как правильно реализовать виджеты Select
и подключить их к функции обратного вызова? (Предполагая, что я правильно определил функцию обратного вызова)
Вы смешиваете обратные вызовы на основе CustomJS и Python. Вам либо нужно:
- Перейти к автономному подходу CustomJS, полностью отказаться от функции обратного вызова python, продолжить работу с частью «.js_on_change», но написать настоящий javascript, чтобы делать то, что вы хотите:
select.x_axis.js_on_change('value',args=dict(thingsyouneedaccesstoforcallback), code='''js-код, управляющий этими вещами/выполняющий обратный вызов''')
- Используйте подход подачи боке на основе Python и вместо этого используйте .on_change(‘value’, python_function).
Я думаю, что 2. было бы проще всего реализовать из кода, который у вас есть выше (в первую очередь потому, что способ, которым вы структурировали свое здание ColumnDataSource через «fetch_data», но 1. также очень достижим с небольшими усилиями и освободит вас от требований к серверу. Если вы опубликуете некоторые фиктивные данные, я буду рад помочь с этим.
Гайка 3
Спасибо! Можете ли вы дать мне небольшую демонстрацию со вторым вариантом?
гмерритт123 4
github.comбоке/боке/клякса/ветка-3.0/примеры/приложение/sliders.py
''' Представить интерактивный проводник функций с ползунковыми виджетами. Прокрутите ползунки, чтобы изменить свойства кривой «sin», или введите в текстовое поле заголовка, чтобы обновить заголовок графика. Используйте команду ``bokeh serve`` для запуска примера, выполнив: боке служить sliders.py в вашей командной строке. Затем перейдите по URL-адресу http://локальный:5006/слайдеры в вашем браузере. ''' импортировать numpy как np из bokeh.io импортировать curdoc из столбца импорта bokeh.layouts, строкиЭтот файл был усечен. показать оригинал
Гайка 5
Вот некоторые фиктивные данные
df.head(10)
виды хищничество воздействие опасность body_wt brain_wt \ 0 Африканская гигантская сумчатая крыса 3 1 3 1.000 6,6 1 ArcticFox 1 1 1 3,385 44,5 2 Арктический суслик 5 2 3 0,920 5,7 3 Бабуин 4 4 4 10,550 179,5 4 Бигбраунбат 1 1 1 0,023 0,3 5 Бразилитапир 4 5 4 160.000 169.0 6 Категория 1 2 1 3.300 25,6 7 Шимпанзе 1 1 1 52,160 440,0 8 Шиншилла 5 4 4 0,425 6,4 9 Корова 5 5 5 465.000 423.0 не_сновидящие сновидения total_sleep life_span gestation 0 6,3 2,0 8,3 4,5 42,0 1 NaN NaN 12,5 14,0 60,0 2 NaN NaN 16,5 NaN 25,0 3 9.1 0,7 9,8 27,0 180,0 4 15,8 3,9 19,7 19,0 35,0 5 5,2 1,0 6,2 30,4 392,0 6 10,9 3,6 14,5 28,0 63,0 7 8,3 1,4 9,7 50,0 230,0 8 11,0 1,5 12,5 7,0 112,0 9 3,2 0,7 3,9 30,0 281,0
До сих пор я создавал свою функцию обратного вызова следующим образом:
def callback(attr, old, new): current_x = select_xaxis. value current_y = select_yaxis.value source.data = ColumnDataSource (fetch_data (current_x, current_y)) p.xaxis.axis_label = current_x p.yaxis.axis_label = current_y проходить select_xaxis = Select (title = 'Переменная оси X', значение = 'body_wt', options=['хищничество','воздействие','опасность','body_wt','brain_wt','non_dreaming','dreaming','total_sleep','life_span','gestation']) select_yaxis = Select (title = 'Переменная оси Y', значение = 'беременность', options=['хищничество','воздействие','опасность','body_wt','brain_wt','non_dreaming','dreaming','total_sleep','life_span','gestation']) select_xaxis.on_change('значение',обратный вызов) select_yaxis.on_change('значение',обратный вызов)
Однако метки осей не обновляются, и данные на графике также не меняются.
lt = макет (select_xaxis, select_yaxis, p) curdoc().add_root(lt) показать (л)
234b6f9f89e52c380649e729b5eab3cf581×656 27 КБ
gmerritt123 6
Вы используете боке в соответствии с инструкциями примера? Вот к чему я веду свой первый ответ. Вы ограничены боке-сервером, когда используете обратные вызовы на стороне Python — вам нужно запустить скрипт через подачу боке: вы не можете просто написать «show(lt)» в конце и заставить обратные вызовы работать. Вероятно, вы получили такое предупреждение:
Вы также пропустили фактическое определение функции для «fetch_data» и то, как вы создали «источник».
Во всяком случае, я справился с тем, что вы мне дали, и сделал несколько случайных предположений о том, как вы намеревались преобразовать свой фрейм данных в экземпляр ColumnDataSource. Читайте комментарии и работайте над собой.
импортировать панд как pd из bokeh.io импортировать curdoc из макета импорта bokeh.layouts из bokeh.models импортировать ColumnDataSource, выбрать из bokeh.ploting импортировать фигуру, показать df = pd.read_csv(r'dummydata. csv') # понятия не имею, что делает "fetch_data" в вашем коде, но давайте сделаем CDS для всего вашего фрейма данных source = ColumnDataSource(data={c:df[c].tolist() для c в df.columns}) opts = list(source.data.keys())[1:] #исключая виды из списка опций # создайте экземпляры полос выбора с 1-й опцией как x и 2-й опцией как первой select_xaxis = Выбрать (опции = опции, значение = опции [0]) select_yaxis = Выбрать (опции = опции, значение = опции [1]) #сделать фигуру и рендерер р = цифра () rend = p.scatter(x=opts[0],y=opts[1],источник=источник) Обратный вызов def (атрибут, старый, новый): # нам нужно сделать следующее в обратном вызове всякий раз, когда пользователь изменяет значение в выборе current_x = select_xaxis.value # получить текущие значения обоих выборок current_y = select_yaxis.value rend.glyph.x = {'field':current_x} # говорит глифу использовать разные поля в источнике данных для получения значений x и y для rend.glyph.x = {'поле':current_y} p.xaxis.axis_label = current_x # обновить метки осей (у вас это уже было) p. yaxis.axis_label = current_y # скажите этому обратному вызову запускаться, когда пользователь изменяет значение операторов select (у вас это уже было) select_xaxis.on_change('значение',обратный вызов) select_yaxis.on_change('значение',обратный вызов) lt = макет (select_xaxis, select_yaxis, p) curdoc().add_root(lt)
Затем следуйте инструкциям по подаче боке в соответствии с приведенным выше примером, чтобы запустить это:
1 Нравится
Гайка 8
Вот моя функция fetch_data()
def fetch_data(x_column_name:str, y_column_name:str): xs = df[x_column_name].to_list() ys = df[y_column_name].to_list() виды = df['виды'].to_list() df1 = pd.DataFrame( {x_column_name: хз, y_column_name : да, 'виды' : виды }) df1. dropna(на месте=Истина) xs = df1[x_column_name].to_list() ys = df1[y_column_name].to_list() виды = df1['виды'].to_list() вернуть dict (xs = xs, ys = ys, видов = видов) источник = ColumnDataSource(fetch_data('body_wt','Gestation')) p = Figure(x_axis_type='log',y_axis_type='log',tooltips=[('species', '@species'),('xs', '@xs'),('ys', '@ys')],title='DVA: Инспектор данных о сне млекопитающих') p.xaxis.axis_label = 'body_wt' p.yaxis.axis_label = 'беременность' круг = p.circle ('xs', 'ys', источник = источник) Обратный вызов def (атрибут, старый, новый): current_x = select_xaxis.value current_y = select_yaxis.value source.data = fetch_data (current_x, current_y) Circle.glyph.x = {'поле':current_x} круг.глиф.у = {'поле':current_y} p.xaxis.axis_label = current_x p.yaxis.axis_label = current_y p.tools.tooltips = [('виды', '@виды'),('current_x', '@current_x'),('current_y', '@current_y')] проходить select_xaxis = Select (title = 'Переменная оси X', значение = 'body_wt', options=['хищничество','воздействие','опасность','body_wt','brain_wt','non_dreaming','dreaming','total_sleep','life_span','gestation']) select_yaxis = Select (title = 'Переменная оси Y', значение = 'беременность', options=['хищничество','воздействие','опасность','body_wt','brain_wt','non_dreaming','dreaming','total_sleep','life_span','gestation']) select_xaxis. on_change('значение',обратный вызов) select_yaxis.on_change('значение',обратный вызов) lt = макет (select_xaxis, select_yaxis, p) curdoc().add_root(lt) curdoc().title = 'dva_ex1'
Я следовал инструкциям по подаче боке и выполнял их через cmd. Тем не менее, это все еще не обновляет сюжет?
_jm 9
Привет @Nut
Одна вещь, которая выделяется, это следующее назначение в вашей функции обратного вызова. Обратите внимание, что ColumnDataSource
, который управляет графиком, является исходной переменной
в фрагменте кода. Членом данных этого является python dict (словарь). Назначение ColumnDataSource словарю несовместимо и, вероятно, является источником проблемы.
source.data = ColumnDataSource (fetch_data (current_x, current_y))
В противном случае, полный автономный пример, который другие могут копировать, вставлять и запускать, был бы полезен для получения дополнительной помощи от добровольцев здесь.
1 Нравится
Гайка 10
@_jm
Хорошо, я изменил его на
source.data = fetch_data(current_x,current_y)
Теперь виджеты работают, но не обновляет данные в графике, точнее удаляет все
gmerritt123 11
По сути, я думаю, что вы упускаете суть объекта ColumnDataSource. Он может хранить все ваши данные, т. е. вам вообще не нужно их изменять, т. е. fetch_data полностью избыточен. Если вы посмотрите на мой пример, я создаю «источник» со всем фреймом данных (т. е. его свойство .data (если вы введете source.data в консоль) содержит каждый столбец в виде ключей и массивов, хранящих данные каждого столбца в виде соответствующих значений. Что модифицирует обратный вызов, так это аргументы x и y глифа рассеяния. «;exposure»), и я говорю ему найти эти столбцы из «источника», «источник» в этом случае не содержит только два графических столбца в данный момент — он по-прежнему содержит все для вас, то есть все столбцы.
Теперь, когда вы дойдете до обратного вызова в моем примере, я скажу обратному вызову обновить аргументы x и y на основе выбранного значения. Теперь боке будет искать эти столбцы из «источника», чтобы управлять средством визуализации рассеяния.
Важно отметить, что «источник» изначально создается со всеми данными, и я не меняю его ни на йоту. Что меняется (т. е. когда изменяются выбранные значения), так это то, какие столбцы из этого источника используются для управления средством визуализации.
Гайка 12
В соответствии с моими инструкциями по заданию «Создайте функцию обратного вызова. Эта функция вызывается всякий раз, когда изменяется текущее значение оси select_x или оси select_y. Здесь вам нужно (1) обновить ColumnDataSource.data новым словарем, возвращенным из fetch_data, (2) обновить метки осей в соответствии с выбранными новыми столбцами». В противном случае я бы согласился с вашими предложениями. Как мне поступить?
гмерритт123 13
Га. Я так далеко отошла от школьных дней, что совершенно забыла концепцию жестких инструкций по выполнению заданий, а не просто делать то, что вы считаете наиболее практичным/эффективным. Я, вероятно, был бы раздражающим, споря с prof/TA об этом
По сути, то, что вы делаете сейчас вместо моего подхода, создает CDS с общими полями «xs» и «ys», данные которых должны быть заменены соответствующими массивами на основе выбранных значений. Вы создаете экземпляр рендерера/глифа (p.circle), сообщая глифу использовать xs и ys . Затем в обратном вызове, т. е. когда пришло время обновления, вы говорите ему искать столбцы, которых нет в исходном коде, поэтому ничего не появляется. Поэтому мой Circle.glyph.x = {‘field’:current_x} теперь проблема. Что вам нужно сделать, так это обновить массивы xs и ys в источнике данных с помощью массивов двух выбранных столбцов (а также всегда сообщать своим всплывающим подсказкам вместо этого использовать поля «@xs» и «@ys»).
1 Нравится
Гайка 14
Спасибо! Можете ли вы показать мне, как должен выглядеть мой обновленный callback()
? Насколько я понял, это должно выглядеть как
def callback(attr, old, new): xs = select_xaxis.value ys = select_yaxis. value source.data = fetch_data(xs,ys) круг.глиф.х = {'поле':xs} круг.глиф.у = {'поле':ys} p.xaxis.axis_label = xs p.yaxis.axis_label = г p.tools.tooltips = [('species', '@species'), ('xs', '@xs'), ('ys', '@ys')] проходить
гмерритт123 15
Нет, вам не понадобится
circle.glyph.x = {'field':xs} круг.глиф.у = {'поле':ys}
больше, потому что этот глиф теперь всегда будет искать поля «xs»/«ys», и теперь вы будете изменять то, что находится в полях «xs» и «ys», через fetch_data.
1 Нравится
Гайка 16
Ты лучший! Надеюсь поддерживать связь, если у меня возникнут новые проблемы в будущем!
система Закрыто