python - 散景中的交互式饼图;反应性地交换变量以绘制
问题描述
我对 Python 和 Bokeh 还很陌生,所以我仍在尝试掌握如何以交互方式交换变量以进行绘图。目前我正在尝试使用散景小部件创建饼图。
这是饼图的样子:-
from operator import index
from bokeh.models.widgets.markups import Div
import numpy as np
from numpy.lib import source
import pandas as pd
from bokeh.io import curdoc,show
from bokeh.layouts import column, row, gridplot
from bokeh.models import ColumnDataSource, Select, Slider, BoxSelectTool, LassoSelectTool, Tabs, Panel, LinearColorMapper, ColorBar, BasicTicker, PrintfTickFormatter, MultiSelect, DataTable, TableColumn
from bokeh.plotting import figure, curdoc
from bokeh.palettes import viridis, gray, cividis, Category20, Category20c
from bokeh.transform import factor_cmap,cumsum
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import classification_report, confusion_matrix, mean_squared_error, r2_score, recall_score, f1_score
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.cluster import KMeans
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from math import pi
from bokeh.transform import cumsum
np.random.seed(42)
print("step 1")
#define the categorical variable
category_a = ['A','B','C']
category_b = ['X','Y','Z']
print("step 2")
df_random = pd.DataFrame({
'id': np.arange(0, 100),
'date': pd.date_range(start='1/1/2021', periods=100, freq='D'),
'month':np.random.randint(1, 12, 100),
'sensor_1': np.random.uniform(0, 1,100),
'sensor_2': np.random.uniform(10, 150, 100),
'sensor_3': np.random.randint(0, 90, 100),
'sensor_4': np.random.randint(0, 450, 100),
'sensor_5': np.random.randint(0, 352, 100),
'categorya': np.random.choice(category_a, 100, p=[0.2, 0.4, 0.4]),
'categoryb': np.random.choice(category_b, 100, p=[0.6, 0.2, 0.2]),
})
column_choices = {
"Sensor 1": "sensor_1",
"Sensor 2": "sensor_2",
"Sensor 3": "sensor_3",
"Sensor 4": "sensor_4",
"Sensor 5": "sensor_5"
}
column_choices_list = list(column_choices.values())
groupeddf = df_random.groupby('categorya')[column_choices_list].mean()
print(groupeddf)
groupeddf['angle'] = groupeddf['sensor_1']/groupeddf['sensor_1'].sum() * 2*pi
groupeddf['color'] = Category20c[len(groupeddf)]
source_pie = ColumnDataSource(data=groupeddf)
p_pie = figure(plot_height=350, title="Pie Chart", toolbar_location=None, tools="")
p_pie.wedge(x=0, y=1, radius=0.4,
start_angle=cumsum('angle', include_zero=True), end_angle=cumsum('angle'),
line_color="white", fill_color='color', legend='categorya', source=source_pie)
show(p_pie)
但是,我正在尝试在小部件中添加以更改df_random
我绊倒的列:-
...
selecty_pie_var = Select(title="Select variable:", options=list(column_choices_list))
def callback(attr,old,new):
df_platform['angle'] = df_platform[selecty_pie_var.value]/df_platform[selecty_pie_var.value].sum() * 2*pi
df_platform['color'] = Category20c[len(df_platform)]
source_pie.data = df_platform
return source_pie
selecty_pie_var.js_on_change('value', callback)
layoutwithwidgets = row(selecty_pie_var,p_pie)
show(layoutwithwidgets)
我想,对于任何称职的 Python 用户来说,以上内容看起来都是一团糟。有人可以帮助我将小部件和饼图链接在一起,以便在我更改列时更新吗?例如,sensor_1
现在正在绘制,但我希望能够将其更改为sensor_2
、sensor_3
等。
任何帮助是极大的赞赏 :)
解决方案
推荐阅读
- javascript - 枚举 Noesis Javascript.NET 中的所有全局对象
- sql - 很难理解 SQL 查询
- pyspark - 如何将 bigquery 表加载到 dataproc 集群
- javascript - 日期选择器和自定义显示格式
- javascript - SASS - 重置最后呈现的样式并重写样式
- android - 如果使用通过转换器的 2 路数据绑定,则不会生成 XML 布局的绑定实现
- apache-nifi - 如何在 Apache nifi 中配置 convertrecord 处理器,以便将 JSON 转换为 AVRO 格式
- c# - 在 C# 中获取组合框的值和键时出错
- python - pandas 中根据条件过滤某些数据行的解决方案
- css - 不继承 textarea 中某些字体设置的规范