国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)可視化 - Streamlit實(shí)現(xiàn)頁(yè)面組件交互與展示(以K-Means為例)

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)可視化 - Streamlit實(shí)現(xiàn)頁(yè)面組件交互與展示(以K-Means為例)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、簡(jiǎn)介

本人數(shù)據(jù)分析小白,最近接觸到了Streamlit這個(gè)組件,發(fā)現(xiàn)真的很好用!尤其是它提供的交互功能,可以讓很多數(shù)據(jù)分析的結(jié)果清晰直觀地展現(xiàn)在頁(yè)面上,比起手動(dòng)修改參數(shù),一遍一遍rerun,真的舒服了不少~~因此這篇文章將以K-Means模型為例,采用iris數(shù)據(jù)集,介紹如何使用streamlit進(jìn)行數(shù)據(jù)交互可視化。

1.1 成品圖

數(shù)據(jù)可視化 - Streamlit實(shí)現(xiàn)頁(yè)面組件交互與展示(以K-Means為例)

1.2 相關(guān)庫(kù)與版本

需要使用的第三方庫(kù),以及我的版本如下:

庫(kù)名稱 版本
streamlit 1.9.0
pandas 1.1.5
numpy 1.22.3
sklearn 0.23.1
matplotlib 3.2.1

以下是補(bǔ)習(xí)推薦網(wǎng)址:

Streamlit:一個(gè)傻瓜式構(gòu)建可視化 web的 Python 神器 -- streamlit - 知乎 (zhihu.com)

其他庫(kù)建議去菜鳥(niǎo)或者官網(wǎng)學(xué)習(xí)(或者在本文遇到不懂的可以直接百度)


二、交互原理

Streamlit的功能是實(shí)現(xiàn)圖形可視化、以及提供交互式的點(diǎn)擊框、選擇框等。最簡(jiǎn)單的方式就是在代碼框里一頓操作把最后的結(jié)果畫(huà)成圖,并展示在頁(yè)面上。而交互式頁(yè)面的原理就是在前面的基礎(chǔ)上多了賦值這一個(gè)操作,有點(diǎn)類似Shell中等待輸入的Input,賦值方式在頁(yè)面中變成了選框。

2.1 一張很丑的自制原理圖

數(shù)據(jù)可視化 - Streamlit實(shí)現(xiàn)頁(yè)面組件交互與展示(以K-Means為例)

?(u1s1,畫(huà)圖3D真好用?。?/p>

先從左邊的側(cè)邊欄上方(黃線流程)看起,最基本的操作就是通過(guò)選擇(Streamlit提供了下拉框和圓點(diǎn)的選擇功能)值,并將值賦給變量,再將變量傳輸給模型。(選擇 ----> 賦值 ----> 傳遞 ----> 模型)

代碼實(shí)現(xiàn)如下

a = st.selectbox('1.你想要設(shè)置的值:', ['1', '2']))    # 一定要賦值,不然選擇框就只是拿來(lái)點(diǎn)一下玩一年的擺設(shè)
output = model(variable=a)    # model就是你想使用的分析模型,需要接受參數(shù)variable,才能返回結(jié)果
print(output)                 # 得到了結(jié)果

傳遞給模型訓(xùn)練完以后,得到訓(xùn)練結(jié)果,就可以讓 Matplotlib 進(jìn)行畫(huà)圖了,這是最基本的一條運(yùn)作原理。

(好嘞,現(xiàn)在你已經(jīng)學(xué)會(huì)了基本操作,讓我們開(kāi)始單挑最終Boss吧?。?/s>

在實(shí)現(xiàn)了基本的畫(huà)圖后,就可以開(kāi)始對(duì)圖像進(jìn)行更多的處理了,Matplotlib畫(huà)出來(lái)的原始圖像并不是很美觀,但是也足夠進(jìn)行觀察了(但是我就是想讓它高級(jí)一點(diǎn),嘿嘿嘿);側(cè)邊欄下方(橙線流程)就是通過(guò)其他的變量去對(duì)圖表的各種屬性進(jìn)行調(diào)整,從而達(dá)到交互式圖表的效果。


三、代碼部分

3.1 省流版(黃線流程)

首先導(dǎo)入庫(kù)

import numpy as np
import pandas as pd
import streamlit as st
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler

然后在終端輸入? ? ? ? ?Streamlit run (你的文件名).py

數(shù)據(jù)可視化 - Streamlit實(shí)現(xiàn)頁(yè)面組件交互與展示(以K-Means為例)

我用的是pycharm,如果是使用Jupyter或者Spyder的小伙伴,可以通過(guò)Win + R打開(kāi)命令窗口,輸入 cmd,打開(kāi)小黑窗后,讀取你的Streamlit文件的路徑

比如你的.py文件在桌面,就在小黑窗輸入? ? cd?C:\Users\Desktop? ? ? ? (路徑因人而異)

然后再輸入? ?streamlit run?(你的文件名).py? ?就可以啦

數(shù)據(jù)可視化 - Streamlit實(shí)現(xiàn)頁(yè)面組件交互與展示(以K-Means為例)

接著開(kāi)始構(gòu)建頁(yè)面內(nèi)容(倒數(shù)兩行的賦值就是第1條黃線<接受模型參數(shù)>的操作)

# streamlit的頁(yè)面布局順序是與代碼位置一致的,因此我先在最前面加一個(gè)大標(biāo)題
st.title('K-Means交互式組件'.center(33, '-'))

# 設(shè)置側(cè)邊欄     Tips:所有側(cè)邊欄的元素都必須在前面加上 sidebar,不然會(huì)在主頁(yè)顯示
st.sidebar.expander('')     # expander必須接受一個(gè) label參數(shù),我這里留了一個(gè)空白
st.sidebar.subheader('在下方調(diào)節(jié)你的參數(shù)')       # 副標(biāo)題
# st.selectbox:創(chuàng)造一個(gè)下拉選擇框的單選題,接收參數(shù): (題目名稱, 題目選項(xiàng))
cluster_class = st.sidebar.selectbox('1.聚類數(shù)量:', list(range(2, 10)))     # 選擇聚類中心,并賦值
minmaxscaler = st.sidebar.radio('2.是否歸一化:', ['是', '否'])         # 選擇是否標(biāo)準(zhǔn)化

?這樣網(wǎng)頁(yè)最原始的模樣就有了(????一定要賦值,不賦值的話,頁(yè)面選擇是不會(huì)返回結(jié)果的)

數(shù)據(jù)可視化 - Streamlit實(shí)現(xiàn)頁(yè)面組件交互與展示(以K-Means為例)

然后就是數(shù)據(jù)、模型的調(diào)用和訓(xùn)練

# 調(diào)用數(shù)據(jù),經(jīng)典艾瑞斯
iris = load_iris()
data = iris['data']

if minmaxscaler == '是':                   # 根據(jù)頁(yè)面中的選擇進(jìn)行判斷是否歸一化
    model_mms = MinMaxScaler().fit(data)   # 調(diào)用歸一標(biāo)準(zhǔn)化方法(也可以自己寫(xiě)一個(gè)函數(shù)處理)
    data = model_mms.transform(data)       # 對(duì) data進(jìn)行標(biāo)準(zhǔn)化

# 調(diào)用模型,這里用K-Means
model = KMeans(n_clusters=cluster_class).fit(data)      # 這里的 cluster_class就是剛剛選框接收到的值(聚成幾類)
data_done = np.c_[data, model.labels_]     # 將結(jié)果和數(shù)據(jù)合并,model.lables:模型訓(xùn)練得到的標(biāo)簽

這時(shí)模型已經(jīng)訓(xùn)練好了,可以用st.dataframe(data_done)查看結(jié)果??(第“4”列就是聚類結(jié)果)

數(shù)據(jù)可視化 - Streamlit實(shí)現(xiàn)頁(yè)面組件交互與展示(以K-Means為例)

?最后通過(guò)matplotlib.pyplot畫(huà)圖

fig, ax = plt.subplots()            # 創(chuàng)建畫(huà)布與子圖
for i in set(model.labels_):        # 選中每一個(gè)聚出來(lái)的類
    index = data_done[:, -1] == i   # 得到每一個(gè)類對(duì)應(yīng)的布爾值索引
    x = data_done[index, 0]         # 第一特征:花瓣長(zhǎng)    Tips:iris有四個(gè)特征,自己手動(dòng)選兩個(gè)
    y = data_done[index, 1]         # 第二特征:花瓣寬
    ax.scatter(x, y)                # 做出散點(diǎn)圖
st.pyplot(fig)                      # 畫(huà)出來(lái)!

數(shù)據(jù)可視化 - Streamlit實(shí)現(xiàn)頁(yè)面組件交互與展示(以K-Means為例)

成功!

省流版完整代碼如下:

import numpy as np
import pandas as pd
import streamlit as st
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler

# streamlit的頁(yè)面布局順序是與代碼位置一致的,因此我先在最前面加一個(gè)大標(biāo)題
st.title('K-Means交互式組件'.center(33, '-'))

# 調(diào)用數(shù)據(jù),經(jīng)典艾瑞斯
iris = load_iris()
data = iris['data']

# ---------黃線第一步:接受模型參數(shù)----------
# 設(shè)置側(cè)邊欄     Tips:所有側(cè)邊欄的元素都必須在前面加上 sidebar,不然會(huì)在主頁(yè)顯示
st.sidebar.expander('')     # expander必須接受一個(gè) label參數(shù),我這里留了一個(gè)空白
st.sidebar.subheader('在下方調(diào)節(jié)你的參數(shù)')       # 副標(biāo)題
# st.selectbox:創(chuàng)造一個(gè)下拉選擇框的單選題,接收參數(shù): (題目名稱, 題目選項(xiàng))
cluster_class = st.sidebar.selectbox('1.聚類數(shù)量:', list(range(2, 10)))     # 選擇聚類中心,并賦值

# st.radio:創(chuàng)造一個(gè)點(diǎn)擊的單選題,接收參數(shù)與 selectbox一樣
minmaxscaler = st.sidebar.radio('2.是否歸一化:', ['是', '否'])         # 選擇是否標(biāo)準(zhǔn)化
if minmaxscaler == '是':                                             # 進(jìn)行判斷
    model_mms = MinMaxScaler().fit(data)                # 調(diào)用歸一標(biāo)準(zhǔn)化方法(也可以自己寫(xiě)一個(gè)函數(shù)處理)
    data = model_mms.transform(data)                    # 對(duì) data進(jìn)行標(biāo)準(zhǔn)化

# ---------灰色磚頭:調(diào)用 K-Means進(jìn)行訓(xùn)練----------
model = KMeans(n_clusters=cluster_class).fit(data)      # 這里的 cluster_class就是第 18行選擇框接收到的值
data_done = np.c_[data, model.labels_]                  # 將結(jié)果和數(shù)據(jù)合并,model.lables:模型訓(xùn)練得到的標(biāo)簽

# ---------黃線第二步:傳遞訓(xùn)練結(jié)果并畫(huà)圖----------
fig, ax = plt.subplots()            # 創(chuàng)建畫(huà)布與子圖
for i in set(model.labels_):
    index = data_done[:, -1] == i   # 每一個(gè)類對(duì)應(yīng)的索引
    x = data_done[index, 0]         # 第一個(gè)特征:花瓣長(zhǎng)度    Tips:iris有四個(gè)特征,自己選兩個(gè)
    y = data_done[index, 1]         # 第二個(gè)特征:花瓣寬度
    ax.scatter(x, y)                # 做出散點(diǎn)圖
st.pyplot(fig)                      # 畫(huà)出來(lái)!

3.2完整版(黃線+紅線)

完整版就是在省流版基礎(chǔ)上加了許多可以調(diào)整畫(huà)圖參數(shù)的組件,以及頁(yè)面裝飾,但是也存在著一些問(wèn)題,我會(huì)在結(jié)尾給出。

相較于省流版,完整版頁(yè)面加入了以下組件:

組件 省流版 完整版
“聚類數(shù)量” 按鈕
“是否歸一化” 按鈕
“展示特征” 按鈕
“第幾類的顏色” 按鈕
“第幾類的形狀” 按鈕
圖標(biāo)元素
頁(yè)面裝飾

這就是超級(jí)會(huì)員與普通會(huì)員噠!

接下來(lái)按照順序一個(gè)一個(gè)進(jìn)行代碼介紹

? ? ? ? 1.“展示特征” 按鈕

????????省流版的展示特征必須要在后臺(tái)代碼塊中修改參數(shù),而在iris數(shù)據(jù)集中,特征有4個(gè):花瓣長(zhǎng)、花瓣寬、花萼長(zhǎng)、花萼寬。因此在展示的時(shí)候如果需要修改特征,就得通過(guò)新的選擇框進(jìn)行賦值,展示。代碼如下:

figure = ['花瓣長(zhǎng)度', '花瓣寬度','花萼長(zhǎng)度','花萼寬度']
figure1 = st.sidebar.selectbox('3.選擇第一類展示特征:', ['花瓣長(zhǎng)度', '花瓣寬度','花萼長(zhǎng)度','花萼寬度'])
figure2 = st.sidebar.selectbox('4.選擇第二類展示特征:', ['花瓣長(zhǎng)度', '花瓣寬度','花萼長(zhǎng)度','花萼寬度'])

? ? ? ? figure1和figure2既是我們選擇后進(jìn)行賦值的變量,但是你的電腦可看不懂 ‘花瓣長(zhǎng)度’ 是什么意思,因此需要建立一個(gè)和選擇框一樣的列表(figure)來(lái)進(jìn)行索引, 因此畫(huà)圖部分的參數(shù)也需要作對(duì)應(yīng)修改:

原代碼
#for i in set(model.labels_):
#    index = data_done[:, -1] == i   # 每一個(gè)類對(duì)應(yīng)的索引
#    x = data_done[index, 0]         # 第一個(gè)特征:花瓣長(zhǎng)度    Tips:iris有四個(gè)特征,自己選兩個(gè)
#    y = data_done[index, 1]         # 第二個(gè)特征:花瓣寬度
#    ax.scatter(x, y)                # 做出散點(diǎn)圖

修改后的代碼
for i in set(model.labels_):
    index = data_done[:, -1] == i
    x = data_done[index, figure.index(figure1)] 

    # e.g.第 0類特征是花瓣長(zhǎng)度,通過(guò)頁(yè)面選擇使 figure1賦值為'花瓣長(zhǎng)度'
    # 然后通過(guò)列表(figure)的索引得到'花瓣長(zhǎng)度'是第 0類特征,這樣就達(dá)到了和原代碼一樣的效果

    y = data_done[index, figure.index(figure2)]    # 與 figure1同理
    ax.scatter(x, y)
st.pyplot(fig)

? ? ? ? 2.“第幾類顏色” 的按鈕、?“第幾類形狀” 的按鈕

? ? ? ? 這個(gè)按鈕設(shè)置,首先要確定的是“總共有幾類”,而分成幾類是由前面通過(guò)選擇框賦值給變量cluster_class確定的。因此只需要加一個(gè)for循環(huán),就可以實(shí)現(xiàn)按鈕數(shù)量跟隨聚類數(shù)量一起變化啦:

for i in range(1, cluster_class +1):    # 第1類 - 第k類 的按鈕
    col1, col2 = st.sidebar.columns(2)  # st.columns(n):將一行分成n列
    with col1:                          # 這里放第一列的東西
        st.selectbox(f'第{i}類顏色', ['黑色', '銀色','亮紅色','棕色','橙色','金黃色','黃色','天藍(lán)色','紫色']))
    with col2:  #第二列的東西
        st.selectbox(f'第{i}類形狀', ['圓形', '朝下三角', '朝上三角形', '正方形', '五邊形', '星型', '六角形', '+號(hào)', 'x號(hào)', '小型菱形']))

數(shù)據(jù)可視化 - Streamlit實(shí)現(xiàn)頁(yè)面組件交互與展示(以K-Means為例)

? ? ? ? ?可以看到頁(yè)面部分已經(jīng)沒(méi)有問(wèn)題了,接下來(lái)是賦值部分,由于聚類的數(shù)量會(huì)變化,而創(chuàng)建的變量無(wú)法做到跟隨數(shù)量變化,因此這里我采用了DataFrame來(lái)記錄變量。由于Streamlit的頁(yè)面每進(jìn)行一次操作就會(huì)刷新一次,因此每次DataFrame的內(nèi)容都會(huì)被重新清空賦值,不需要擔(dān)心數(shù)據(jù)重復(fù)的情況。修改后的代碼如下:

choice = pd.DataFrame([])               # 先創(chuàng)建一個(gè)空的DataFrame
for i in range(1, cluster_class +1):
    col1, col2 = st.sidebar.columns(2)  # 分成兩列
    with col1:
        # 給DataFrame的第i行,color列新增一條記錄
        choice.loc[i, 'color'] = trans(st.selectbox(f'第{i}類顏色', 
['黑色', '銀色','亮紅色','棕色','橙色','金黃色','黃色','天藍(lán)色','紫色']))

        # 給DataFrame的第i行,shape列新增一條記錄
    with col2:
        choice.loc[i, 'shape'] = trans(st.selectbox(f'第{i}類形狀', 
['圓形', '朝下三角', '朝上三角形', '正方形', '五邊形', '星型', '六角形', '+號(hào)', 'x號(hào)', '小型菱形']))

有朋友可能注意到trans,這是一個(gè)自定義函數(shù),功能和上面的
figure.index(figure1)類似,就是根據(jù)賦值返回電腦可識(shí)別的字符,
trans的內(nèi)容在末尾完整版代碼已給出。

????????這樣就實(shí)現(xiàn)了不同類的賦值的記錄,然后把他放到matplotlib里面

for i in set(model.labels_):
    index = data_done[:, -1] == i
    # 新增的代碼 ????
    color = choice.loc[i+1, 'color']
    shape = choice.loc[i+1, 'shape']
    # 新增的代碼 ????
    x = data_done[index, figure.index(figure1)]
    y = data_done[index, figure.index(figure2)]
    ax.scatter(x, y, c=color, marker=shape)    # 這里對(duì)應(yīng)地加入顏色和形狀的參數(shù)就可以了
st.pyplot(fig)

? ? ? ? 3.圖表元素

? ? ? ? 簡(jiǎn)簡(jiǎn)單單加幾行代碼給圖表美化一下:

for i in set(model.labels_):
    index = data_done[:, -1] == i
    color = choice.loc[i+1, 'color']
    shape = choice.loc[i+1, 'shape']
    x = data_done[index, figure.index(figure1)]         # 改選擇特征
    y = data_done[index, figure.index(figure2)]
    ax.scatter(x, y, c=color, marker=shape)
# 下面是新增的部分??????
# 設(shè)置字體
font_dict = dict(fontsize=16,        # 字體大小     
              color='maroon',        # 顏色
              family='SimHei',)      # 類型
# 設(shè)置x, y軸標(biāo)題
ax.set_xlabel(figure1, fontdict=font_dict)
ax.set_ylabel(figure2, fontdict=font_dict)

# 設(shè)置圖表標(biāo)題
ax.set_title('散點(diǎn)圖', fontdict=dict(fontsize=16, color='black', family='SimHei',))

# 設(shè)置圖例
ax.legend(set(model.labels_))

# 取消坐標(biāo)顯示
ax.set_xticks([])
ax.set_yticks([])

st.pyplot(fig)

? ? ? ? 4.頁(yè)面裝飾

? ? ? ? streamlit的st.markdown()提供了非常強(qiáng)大的功能,可以直接在里面寫(xiě)html或css?。。ǖ俏也欢@倆語(yǔ)言,霧),因此如果有學(xué)過(guò)網(wǎng)頁(yè)的小伙伴,可以自行修改頁(yè)面元素。

? ? ? ? 我在網(wǎng)上抄了一些能用的樣式,可以參考一下:

# 背景圖片的網(wǎng)址
img_url = 'https://img.zcool.cn/community/0156cb59439764a8012193a324fdaa.gif'

# 修改背景樣式
st.markdown('''<style>.css-fg4pbf{background-image:url(''' + img_url + ''');
background-size:100% 100%;background-attachment:fixed;}</style>
''', unsafe_allow_html=True) 

# 側(cè)邊欄樣式
st.markdown('''<style>#root > div:nth-child(1) > div > div > div > div >
section.css-1lcbmhc.e1fqkh3o3 > div.css-1adrfps.e1fqkh3o2
{background:rgba(255,255,255,0.5)}</style>''', unsafe_allow_html=True)         

# 底邊樣式  
st.markdown('''<style>#root > div:nth-child(1) > div > div > div > div >
section.main.css-1v3fvcr.egzxvld3 > div > div > div
{background-size:100% 100% ;background:rgba(207,207,207,0.9);
color:red; border-radius:5px;} </style>''', unsafe_allow_html=True)                  

請(qǐng)注意,一定要在st.markdown最后加 unsafe_allow_html=True ,不然代碼會(huì)直接在頁(yè)面上顯示                           

????????對(duì)比一下修改前后:

????????數(shù)據(jù)可視化 - Streamlit實(shí)現(xiàn)頁(yè)面組件交互與展示(以K-Means為例)

? ? ? ? 雖然但是還是好看一點(diǎn)點(diǎn)吧!

成功!

完整版完整代碼如下:

import numpy as np
import pandas as pd
import streamlit as st
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler

img_url = 'https://img.zcool.cn/community/0156cb59439764a8012193a324fdaa.gif'       # 背景圖片的網(wǎng)址
st.markdown('''<style>.css-fg4pbf{background-image:url(''' + img_url + ''');
background-size:100% 100%;background-attachment:fixed;}</style>
''', unsafe_allow_html=True)                                                        # 修改背景樣式

iris = load_iris()
data = iris['data']

st.title('K-Means交互式組件'.center(33, '-'))

st.sidebar.expander('')
st.sidebar.subheader('在下方調(diào)節(jié)你的參數(shù)')
cluster_class = st.sidebar.selectbox('1.聚類數(shù)量:', list(range(2, 10)))

minmaxscaler = st.sidebar.radio('2.是否歸一化:', ['是', '否'])
if minmaxscaler == '是':
    model_mms = MinMaxScaler().fit(data)
    data = model_mms.transform(data)

figure = ['花瓣長(zhǎng)度', '花瓣寬度','花萼長(zhǎng)度','花萼寬度']
figure1 = st.sidebar.selectbox('3.選擇第一類展示特征:', ['花瓣長(zhǎng)度', '花瓣寬度','花萼長(zhǎng)度','花萼寬度'])
figure2 = st.sidebar.selectbox('4.選擇第二類展示特征:', ['花瓣長(zhǎng)度', '花瓣寬度','花萼長(zhǎng)度','花萼寬度'])

def trans(select):
    if select == '黑色':
        return 'black'
    elif select == '銀色':
        return 'silver'
    elif select == '亮紅色':
        return 'lightcoral'
    elif select == '棕色':
        return 'brown'
    elif select == '橙色':
        return 'orange'
    elif select == '金黃色':
        return 'gold'
    elif select == '黃色':
        return 'yellow'
    elif select == '綠色':
        return 'lawngreen'
    elif select == '天藍(lán)色':
        return 'cyan'
    elif select == '紫色':
        return 'purple'
    elif select == '圓形':
        return 'o'
    elif select == '朝下三角':
        return 'v'
    elif select == '朝上三角形':
        return '^'
    elif select == '正方形':
        return 's'
    elif select == '五邊形':
        return 'p'
    elif select == '星型':
        return '*'
    elif select == '六角形':
        return 'h'
    elif select == '+號(hào)':
        return '+'
    elif select == 'x號(hào)':
        return 'x'
    elif select == '小型菱形':
        return 'd'

choice = pd.DataFrame([])
for i in range(1, cluster_class +1):
    col1, col2 = st.sidebar.columns(2)  # 分成兩列
    with col1:  #第一列的東西
        choice.loc[i, 'color'] = trans(st.selectbox(f'第{i}類顏色', ['黑色', '銀色','亮紅色','棕色','橙色','金黃色','黃色',
                                                                 '天藍(lán)色','紫色']))
    with col2:  #第二列的東西
        choice.loc[i, 'shape'] = trans(st.selectbox(f'第{i}類形狀', ['圓形', '朝下三角', '朝上三角形', '正方形', '五邊形', '星型'
            , '六角形', '+號(hào)', 'x號(hào)', '小型菱形']))

model = KMeans(n_clusters=cluster_class).fit(data)
data_done = np.c_[data, model.labels_]


# st.write(model.labels_)
# st.write(model.cluster_centers_)

fig, ax = plt.subplots()
for i in set(model.labels_):
    index = data_done[:, -1] == i
    color = choice.loc[i+1, 'color']
    shape = choice.loc[i+1, 'shape']
    x = data_done[index, figure.index(figure1)]         # 改選擇特征
    y = data_done[index, figure.index(figure2)]
    ax.scatter(x, y, c=color, marker=shape)
# plt.axis('off')
font_dict = dict(fontsize=16,
              color='maroon',
              family='SimHei',)
ax.set_xlabel(figure1, fontdict=font_dict)
ax.set_ylabel(figure2, fontdict=font_dict)
ax.set_title('散點(diǎn)圖', fontdict=dict(fontsize=16, color='black', family='SimHei',))
ax.legend(set(model.labels_))
ax.set_xticks([])
ax.set_yticks([])
# ax.tick_params(bottom=False,top=False,left=False,right=False)
st.pyplot(fig)

st.markdown('''<style>#root > div:nth-child(1) > div > div > div > div >
 section.css-1lcbmhc.e1fqkh3o3 > div.css-1adrfps.e1fqkh3o2
 {background:rgba(255,255,255,0.5)}</style>''', unsafe_allow_html=True)         # 側(cè)邊欄樣式

st.markdown('''<style>#root > div:nth-child(1) > div > div > div > div >
section.main.css-1v3fvcr.egzxvld3 > div > div > div
 {background-size:100% 100% ;background:rgba(207,207,207,0.9);
color:red; border-radius:5px;} </style>''', unsafe_allow_html=True)             # 底邊樣式

?四、缺點(diǎn)

目前已知的缺點(diǎn)就是每次打開(kāi)網(wǎng)頁(yè),所有的選項(xiàng)都是默認(rèn)的第一個(gè),因此會(huì)出現(xiàn)全是小黑圓點(diǎn)的y=x線條hhhhh,需要自己一個(gè)一個(gè)去改;另外在修改的過(guò)程中,由于每選項(xiàng)一次,頁(yè)面都會(huì)刷新一次,因此K-Means的聚類結(jié)果也會(huì)重新計(jì)算一次,比如label是1的花,可能刷新一次后label變成了2(還是同一個(gè)類,但是標(biāo)簽變了),這就導(dǎo)致圖表中相同類點(diǎn)的款式會(huì)變來(lái)變?nèi)?/strong>??

如果有大佬提供解決方法就太棒啦!感激不盡!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-430551.html


到了這里,關(guān)于數(shù)據(jù)可視化 - Streamlit實(shí)現(xiàn)頁(yè)面組件交互與展示(以K-Means為例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Streamlit 講解專欄(十一):數(shù)據(jù)可視化-圖表繪制詳解(中)

    Streamlit 講解專欄(十一):數(shù)據(jù)可視化-圖表繪制詳解(中)

    在上一篇博文《 Streamlit 講解專欄(十):數(shù)據(jù)可視化-圖表繪制詳解(上)》中,我們學(xué)習(xí)了一些關(guān)于數(shù)據(jù)可視化的基礎(chǔ)知識(shí),探索了Streamlit庫(kù)中的幾個(gè)常見(jiàn)圖表繪制函數(shù),包括st.line_chart、st.area_chart、st.bar_chart和st.pyplot。通過(guò)這些函數(shù),我們可以輕松地繪制不同類型的圖表

    2024年02月10日
    瀏覽(33)
  • 界面控件DevExpress WinForms Gauge組件 - 實(shí)現(xiàn)更高級(jí)別數(shù)據(jù)可視化

    界面控件DevExpress WinForms Gauge組件 - 實(shí)現(xiàn)更高級(jí)別數(shù)據(jù)可視化

    DevExpress WinForms控件包含了超過(guò)150個(gè)隨時(shí)可用的儀表盤(pán)預(yù)設(shè),包括圓形,數(shù)字,線性和狀態(tài)指示器等,來(lái)幫助用戶實(shí)現(xiàn)更高級(jí)的數(shù)據(jù)可視化。 DevExpress WinForms有180+組件和UI庫(kù),能為Windows Forms平臺(tái)創(chuàng)建具有影響力的業(yè)務(wù)解決方案。同時(shí)能完美構(gòu)建流暢、美觀且易于使用的應(yīng)用程序

    2024年02月06日
    瀏覽(28)
  • 前端實(shí)現(xiàn)自適應(yīng)屏幕數(shù)據(jù)可視化大屏(vue + v-scale-screen組件 + dataV組件)

    前言 目前市面上有很多付費(fèi)的數(shù)據(jù)可視化平臺(tái),作為一個(gè)代碼編程人員,為啥不自己搞一套呢,不僅自己可以增加自己的技能,也可以減少開(kāi)發(fā)成本,何樂(lè)而不為呢? 寫(xiě)這篇文章,一方面工作有需求要實(shí)現(xiàn)數(shù)據(jù)可視化大屏,另一方面當(dāng)然現(xiàn)在也有很多場(chǎng)景都用到數(shù)據(jù)可視化

    2024年02月08日
    瀏覽(17)
  • streamlit (python構(gòu)建web可視化框架)筆記

    streamlit (python構(gòu)建web可視化框架)筆記

    pip install streamlit 創(chuàng)建一個(gè)python文件 demo.py ,使用命令行運(yùn)行在瀏覽器上 streamlit run demo.py 。 官方文檔 Streamlit documentation 中文文檔 可參考博客1-專欄 streamlit 提供了基于 python 的 web應(yīng)用程序框架 ,以高效靈活的方式 可視化數(shù)據(jù) 。主要功能 streamlit 對(duì)數(shù)據(jù)可視化渲染,表格、地

    2023年04月26日
    瀏覽(26)
  • 基于streamlit的Python Web可視化展示模板

    基于streamlit的Python Web可視化展示模板

    全國(guó)大學(xué)數(shù)據(jù)集 ?數(shù)據(jù)集 工作臺(tái) - Heywhale.com 工作臺(tái) - Heywhale.com?? 可視化界面 ? ? ?主函數(shù) streamlit 啟動(dòng)? 打開(kāi)python文件對(duì)應(yīng)的文件夾目錄 ? 使用streamlit run 對(duì)應(yīng)的py文件? 登錄界面streamlit實(shí)現(xiàn),這里streamlit框架是一直不斷刷新,所以要用外部的控制刷新,或者跳轉(zhuǎn)來(lái)解決 選

    2024年01月21日
    瀏覽(25)
  • 教你用python的Streamlit庫(kù)制作可視化網(wǎng)頁(yè)應(yīng)用

    教你用python的Streamlit庫(kù)制作可視化網(wǎng)頁(yè)應(yīng)用

    當(dāng)涉及到編寫(xiě)交互式應(yīng)用程序時(shí),Streamlit 是一個(gè)非常流行和強(qiáng)大的 Python 庫(kù)。它使得創(chuàng)建數(shù)據(jù)可視化和網(wǎng)頁(yè)應(yīng)用程序變得簡(jiǎn)單,無(wú)需太多的代碼。 以下是一個(gè)簡(jiǎn)單的 Streamlit 教程,它將帶你從頭開(kāi)始創(chuàng)建一個(gè)基本的交互式應(yīng)用程序。 步驟1:安裝 Streamlit 首先,確保你已經(jīng)安裝

    2024年02月05日
    瀏覽(31)
  • 界面組件Telerik UI for WPF可輕松實(shí)現(xiàn)直方圖,讓數(shù)據(jù)可視化更簡(jiǎn)單

    界面組件Telerik UI for WPF可輕松實(shí)現(xiàn)直方圖,讓數(shù)據(jù)可視化更簡(jiǎn)單

    Telerik UI for WPF擁有超過(guò)100個(gè)控件來(lái)創(chuàng)建美觀、高性能的桌面應(yīng)用程序,同時(shí)還能快速構(gòu)建企業(yè)級(jí)辦公WPF應(yīng)用程序。UI for WPF支持MVVM、觸摸等,創(chuàng)建的應(yīng)用程序可靠且結(jié)構(gòu)良好,非常容易維護(hù),其直觀的API將無(wú)縫地集成Visual Studio工具箱中。 Telerik UI for WPF | 下載試用 (Q技術(shù)交流:

    2024年02月08日
    瀏覽(20)
  • 【數(shù)據(jù)可視化】(二)數(shù)據(jù)探索組件

    目錄 0.簡(jiǎn)介 一、數(shù)據(jù)模式與數(shù)據(jù)組織 1、數(shù)據(jù)的定義 2、數(shù)據(jù)庫(kù)的定義 3、什么是數(shù)據(jù)模式? 4、數(shù)據(jù)模式舉例 5、什么是數(shù)據(jù)綱要? 6、數(shù)據(jù)組織的層次 二、矢量數(shù)據(jù) 1、什么是

    2024年02月14日
    瀏覽(26)
  • 數(shù)據(jù)可視化大屏的頁(yè)面布局以及自適應(yīng)

    數(shù)據(jù)可視化大屏的頁(yè)面布局以及自適應(yīng)

    在做數(shù)據(jù)可視化大屏之前,我們需要考慮到頁(yè)面的布局問(wèn)題以及頁(yè)面縮放自適應(yīng)問(wèn)題,下面分別就這兩個(gè)方面講解。 頁(yè)面布局 類似這種頁(yè)面區(qū)塊的明顯劃分,常用的布局方式有兩種: 1、 flex 布局 2、 grid 布局 grid布局 grid 布局可以按區(qū)塊來(lái)劃分頁(yè)面布局,并且可以在劃分布

    2024年02月05日
    瀏覽(18)
  • 記錄vue3+echarts搭建數(shù)據(jù)可視化頁(yè)面!

    記錄vue3+echarts搭建數(shù)據(jù)可視化頁(yè)面!

    提示:記錄一下寫(xiě)頁(yè)面的時(shí)候遇到過(guò)的一些小問(wèn)題! 頁(yè)面布局就是簡(jiǎn)單的用了個(gè)三欄式布局,在寫(xiě)頁(yè)面的過(guò)程中對(duì)于多個(gè)頁(yè)面共同使用的部分要注意善用組件復(fù)用,避免寫(xiě)冗余重復(fù)的代碼! 比如說(shuō)對(duì)于需要重復(fù)使用的圖表容器,可以將其注冊(cè)為全局組件V3Echarts.vue,當(dāng)需要表

    2024年02月16日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包