如何使用Plotly和Dash進行數據可視化

来源:https://www.cnblogs.com/huaweiyun/p/18136051
-Advertisement-
Play Games

本文分享自華為雲社區《從數據到部署使用Plotly和Dash實現數據可視化與生產環境部署》,作者: 檸檬味擁抱。 數據可視化是數據分析中至關重要的一環,它能夠幫助我們更直觀地理解數據併發現隱藏的模式和趨勢。在Python中,有許多強大的工具可以用來進行數據可視化,其中Plotly和Dash是兩個備受 ...


本文分享自華為雲社區《從數據到部署使用Plotly和Dash實現數據可視化與生產環境部署》,作者: 檸檬味擁抱。

數據可視化是數據分析中至關重要的一環,它能夠幫助我們更直觀地理解數據併發現隱藏的模式和趨勢。在Python中,有許多強大的工具可以用來進行數據可視化,其中Plotly和Dash是兩個備受歡迎的選擇。Plotly提供了豐富多樣的互動式繪圖功能,而Dash則是一個用於構建互動式Web應用的Python框架。本文將介紹如何使用Plotly和Dash進行數據可視化,並通過案例代碼展示其應用。

安裝Plotly與Dash

首先,我們需要安裝Plotly和Dash庫。你可以通過以下命令使用pip來安裝它們:

pip install plotly dash

安裝完成後,我們就可以開始使用這兩個庫了。

案例代碼:簡單的數據可視化應用

讓我們以一個簡單的例子開始,假設我們有一些關於銷售數據的CSV文件,我們想要創建一個互動式的圖表來可視化這些數據,並將其部署為一個Web應用。首先,我們需要導入必要的庫:

import dash
from dash import dcc, html
import plotly.express as px
import pandas as pd

# 讀取數據
df = pd.read_csv('sales_data.csv')

# 創建Dash應用
app = dash.Dash(__name__)

# 佈局
app.layout = html.Div([
    html.H1("銷售數據可視化"),
    dcc.Graph(
        id='sales-graph'
    )
])

# 回調函數
@app.callback(
    dash.dependencies.Output('sales-graph', 'figure'),
    [dash.dependencies.Input('sales-graph', 'value')]
)
def update_graph(selected_year):
    filtered_df = df[df['Year'] == selected_year]
    fig = px.bar(filtered_df, x='Month', y='Sales', title=f'銷售數據 - {selected_year}')
    return fig

# 啟動應用
if __name__ == '__main__':
    app.run_server(debug=True)

在這個例子中,我們首先讀取了名為sales_data.csv的CSV文件,然後創建了一個Dash應用。在應用的佈局中,我們定義了一個標題和一個空的圖表區域。然後,我們設置了一個回調函數,當用戶選擇不同的年份時,圖表將會更新以顯示相應年份的銷售數據。最後,我們通過調用run_server方法來啟動應用。

確保你的sales_data.csv文件包含了必要的數據欄位(比如Year、Month和Sales),這樣代碼才能正常運行。

案例代碼:高級數據可視化與交互

在上一個案例中,我們展示瞭如何使用Dash和Plotly創建一個簡單的數據可視化應用。現在,讓我們進一步探索一些高級功能,比如添加更多交互性和定製化。

假設我們想要展示銷售數據的趨勢,並允許用戶通過選擇不同的產品類別來查看不同的趨勢。我們可以通過下麵的代碼來實現這個功能:

import dash
from dash import dcc, html
import plotly.express as px
import pandas as pd

# 讀取數據
df = pd.read_csv('sales_data.csv')

# 創建Dash應用
app = dash.Dash(__name__)

# 佈局
app.layout = html.Div([
    html.H1("銷售數據趨勢"),
    dcc.Dropdown(
        id='product-dropdown',
        options=[
            {'label': '產品A', 'value': 'Product A'},
            {'label': '產品B', 'value': 'Product B'},
            {'label': '產品C', 'value': 'Product C'}
        ],
        value='Product A'
    ),
    dcc.Graph(
        id='sales-trend'
    )
])

# 回調函數
@app.callback(
    dash.dependencies.Output('sales-trend', 'figure'),
    [dash.dependencies.Input('product-dropdown', 'value')]
)
def update_trend(selected_product):
    filtered_df = df[df['Product'] == selected_product]
    fig = px.line(filtered_df, x='Month', y='Sales', title=f'{selected_product}銷售趨勢')
    return fig

# 啟動應用
if __name__ == '__main__':
    app.run_server(debug=True)

在這個例子中,我們添加了一個下拉菜單,允許用戶選擇不同的產品類別。當用戶選擇不同的產品後,圖表將會更新以顯示所選產品的銷售趨勢。這樣,用戶就可以更靈活地探索不同產品的銷售情況。

除了簡單的折線圖外,Plotly還提供了豐富的圖表類型和定製選項,可以滿足更多複雜的可視化需求。Dash則允許我們構建互動式的Web應用,並通過回調函數實現圖表的動態更新,為用戶提供更好的體驗。

添加交互性與樣式美化

在上述案例中,我們展示瞭如何使用Dash和Plotly創建數據可視化應用,並提供了基本的交互功能。現在,讓我們進一步添加一些交互性和樣式美化,使我們的應用更加吸引人和易於使用。

import dash
from dash import dcc, html, callback_context
import plotly.express as px
import pandas as pd

# 讀取數據
df = pd.read_csv('sales_data.csv')

# 獲取唯一的產品列表
available_products = df['Product'].unique()

# 創建Dash應用
app = dash.Dash(__name__)

# 應用樣式
app.layout = html.Div([
    html.H1("銷售數據趨勢", style={'textAlign': 'center'}),
    html.Div([
        html.Label("選擇產品:"),
        dcc.Dropdown(
            id='product-dropdown',
            options=[{'label': product, 'value': product} for product in available_products],
            value=available_products[0]
        )
    ], style={'width': '50%', 'margin': 'auto', 'textAlign': 'center'}),
    dcc.Graph(
        id='sales-trend',
        config={'displayModeBar': False}  # 禁用圖表的模式欄
    )
], style={'padding': '20px'})

# 回調函數
@app.callback(
    dash.dependencies.Output('sales-trend', 'figure'),
    [dash.dependencies.Input('product-dropdown', 'value')]
)
def update_trend(selected_product):
    filtered_df = df[df['Product'] == selected_product]
    fig = px.line(filtered_df, x='Month', y='Sales', title=f'{selected_product}銷售趨勢')
    return fig

# 啟動應用
if __name__ == '__main__':
    app.run_server(debug=True)

在這個例子中,我們添加了一些樣式以使應用看起來更吸引人。我們設置了標題居中顯示,併在產品下拉菜單周圍添加了一些空白空間以增加佈局的美觀性。此外,我們還禁用了圖表的模式欄,以簡化用戶界面。

通過這些改進,我們的應用現在不僅提供了強大的互動式數據可視化功能,而且具有更好的外觀和用戶體驗。這將使用戶更願意使用我們的應用來探索數據,並從中獲得有價值的見解。

部署至生產環境

在完成數據可視化應用的開發之後,我們通常希望將應用部署到生產環境中,以便其他用戶能夠訪問和使用。在本節中,我們將討論如何將我們的Dash應用部署到生產伺服器上。

使用Gunicorn和Nginx

Gunicorn是一個Python WSGI(HTTP伺服器) HTTP伺服器,它能夠處理來自Web應用的HTTP請求。Nginx則是一個高性能的HTTP和反向代理伺服器,通常用於處理靜態文件和負載均衡。

首先,我們需要安裝Gunicorn和Nginx:

pip install gunicorn
sudo apt-get install nginx

接下來,我們使用Gunicorn來運行我們的Dash應用:

gunicorn -w 4 -b 0.0.0.0:8050 your_app:app

這將在本地啟動Gunicorn伺服器,並將Dash應用運行在8050埠上。接下來,我們需要配置Nginx來作為反向代理,將HTTP請求轉發到Gunicorn伺服器上。

配置Nginx

在Nginx的配置文件中添加以下內容:

server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://127.0.0.1:8050;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

將your_domain.com替換為你的功能變數名稱。然後重新載入Nginx配置:

sudo systemctl reload nginx

現在,你的Dash應用已經成功部署到生產環境中,並且可以通過你的功能變數名稱訪問了。

使用HTTPS

為了提高安全性,我們還可以配置Nginx來使用HTTPS協議。你需要獲取SSL證書並將其配置到Nginx中。一種簡單的方法是使用Let’s Encrypt來獲取免費的SSL證書。以下是一個簡單的配置示例:

server {
    listen 80;
    server_name your_domain.com;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name your_domain.com;

    ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8050;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

這樣配置後,你的Dash應用將通過HTTPS協議提供服務,並且所有的HTTP請求都會被重定向到HTTPS。

集成用戶認證和許可權管理

在某些情況下,你可能希望限制對數據可視化應用的訪問,只允許特定用戶或用戶組訪問。為了實現這一點,我們可以集成用戶認證和許可權管理系統。

使用基本認證

一種簡單的方法是使用基本認證(Basic Authentication)。你可以在Nginx中配置基本認證,要求用戶在訪問應用之前提供用戶名和密碼。以下是一個示例Nginx配置:

server {
    listen 443 ssl;
    server_name your_domain.com;

    ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;

    location / {
        auth_basic "Restricted Access";
        auth_basic_user_file /etc/nginx/.htpasswd;

        proxy_pass http://127.0.0.1:8050;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

在這個配置中,我們使用auth_basic指令啟用基本認證,並指定了一個密碼文件/etc/nginx/.htpasswd。你需要使用htpasswd工具創建這個密碼文件,並向其中添加用戶名和密碼。

使用OAuth認證

另一種常見的方法是使用OAuth認證。通過OAuth,你可以將用戶的認證過程委托給第三方身份提供者,如Google、GitHub等。一旦用戶通過第三方身份提供者認證成功,他們就可以訪問你的應用。

你可以使用Dash的dash-auth庫來實現OAuth認證。該庫提供了一種簡單的方式來集成多種OAuth提供者,並限制對Dash應用的訪問。

添加許可權管理

除了認證之外,你可能還希望對用戶進行授權,以確定他們是否有權訪問特定的數據或功能。一種常見的方法是在應用中實現角色基礎的訪問控制(Role-Based Access Control,RBAC)系統。通過RBAC,你可以將用戶分配到不同的角色,併在應用中限制不同角色的訪問許可權。

你可以在Dash應用中實現RBAC系統,根據用戶的角色來決定他們是否有權執行特定操作。這可能涉及到在用戶登錄時檢查他們的角色,並根據角色動態地調整應用中的功能和數據訪問許可權。

日誌記錄和錯誤處理

在部署生產環境的應用時,日誌記錄和錯誤處理是非常重要的。良好的日誌記錄可以幫助你追蹤應用的運行情況,並及時發現和解決問題。錯誤處理能夠提高應用的穩定性,減少因錯誤而導致的服務中斷。

配置日誌記錄

首先,讓我們配置應用的日誌記錄。Dash應用通常會輸出日誌到stdout或stderr,我們可以通過重定向這些日誌到一個文件來進行記錄。我們還可以使用Python的logging模塊來實現更高級的日誌記錄。

import logging

logging.basicConfig(filename='app.log', level=logging.INFO)

在Dash應用中添加上述代碼將會把日誌記錄到名為app.log的文件中,並設置記錄級別為INFO。你可以根據需要調整日誌級別,以便記錄不同程度的信息。

錯誤處理

另一個重要的方面是錯誤處理。當應用發生錯誤時,我們希望能夠捕獲並記錄這些錯誤,同時向用戶提供友好的錯誤信息。

在Dash應用中,你可以使用try-except塊來捕獲異常,併在發生異常時返回一個錯誤頁面或顯示一條友好的錯誤消息。

@app.server.errorhandler(Exception)
def handle_error(e):
    logging.error(f'An error occurred: {str(e)}')
    return html.H1("Oops! Something went wrong."), 500

在上述代碼中,我們定義了一個錯誤處理函數handle_error,它捕獲了所有的異常。當發生異常時,它會將錯誤信息記錄到日誌中,並返回一個包含錯誤消息的頁面給用戶。

通過良好的日誌記錄和錯誤處理,我們可以更好地瞭解應用的運行情況,併在發生錯誤時採取相應的措施來保障應用的穩定性和可靠性。

監控和性能優化

最後,一旦應用部署到生產環境中,我們還需要定期監控應用的性能,並採取措施來優化性能。這包括監控應用的響應時間、記憶體使用情況、CPU負載等指標,並根據監控結果進行優化。

你可以使用監控工具如Prometheus、Grafana等來監控應用的性能指標,並根據監控結果進行調整和優化。

總結

本文詳細介紹了將Dash應用部署到生產環境的關鍵步驟和必要措施。首先,我們討論了使用Gunicorn和Nginx來部署Dash應用的方法,並展示瞭如何通過HTTPS協議提高應用的安全性。接著,我們探討瞭如何集成用戶認證和許可權管理系統,以及如何配置日誌記錄和錯誤處理,從而提高應用的穩定性和可靠性。最後,我們強調了監控和性能優化的重要性,並提出了一些監控工具和優化方法。通過這些措施,我們可以將Dash應用部署到生產環境中,並使其在生產環境中更加健壯和可靠,為用戶提供優質的服務和體驗。

 

點擊關註,第一時間瞭解華為雲新鮮技術~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 適配器模式(Adapter Pattern) 結構型設計模式,見名知意,就是兩個不相容的介面之間的橋梁。它結合了兩個獨立介面的功能。 主要解決:常常要將一些"現存的對象"放到新的環境中,而新環境要求的介面是現對象不能滿足的。 關鍵代碼:適配器繼承或依賴已有的對象,實現想要的目標介面。 優點: 1、可 ...
  • 領域驅動設計(DDD)裡面有一堆專業術語,比如領域、子域、核心域、通用域、支撐域等等,聽著是不是覺得挺嚇人?別怕,我來帶你輕鬆搞懂它們。 如何理解領域和子域? 領域是指一定的業務範圍或問題域。在解決業務問題時,DDD 會將業務領域進行細分,將問題範圍限定在一定的邊界內,在這個邊界內建立領域模型,用代 ...
  • 策略模式(Strategy Pattern) 指對象有某個行為,但是在不同的場景中,該行為有不同的實現演算法。將每個演算法封裝在獨立的類中,使得它們可以互相替換。可以在運行時根據需要選擇不同的演算法,而不需要修改客戶端代碼。 主要解決:在有多種演算法相似的情況下,使用 if...else 所帶來的複雜和難以 ...
  • 抽象工廠模式(Abstract Factory Pattern): 是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。 在抽象工廠模式中,介面是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工 ...
  • 原理 在看雪看到一篇文章:逆向調用QQ截圖NT與WeChatOCR-軟體逆向。裡面說了怎麼調用微信和QQ本地的OCR模型,還有很詳細的分析過程。 我稍微看了下文章,多的也看不懂。大概流程是使用mmmojo.dll這個dll來與WeChatOCR.exe做通信的,也是用它來啟動和關閉WeChatOCR ...
  • C++ 預設參數 預設參數概述 在 C++ 中,函數參數可以擁有預設值。這意味著,在調用函數時,如果省略了某個參數,那麼將使用為該參數指定的預設值。 設置預設參數 預設參數值使用等號 = 符號進行設置,位於參數聲明的類型之後。例如: void myFunction(string country = ...
  • 目錄一、介紹二、安裝三、導入四、基本使用4.1 發送GET 請求4.2 POST請求發送JSON數據4.3 Post 文件上傳4.4 GoRequests 使用代理4.5 Gorequests 使用session五、HTTP服務端代碼 一、介紹 官方文檔 DOC: https://pkg.go.de ...
  • 利用PyTorch訓練模型識別數字+英文圖片驗證碼 摘要:使用深度學習框架PyTorch來訓練模型去識別4-6位數字+字母混合圖片驗證碼(我們可以使用第三方庫captcha生成這種圖片驗證碼或者自己收集目標網站的圖片驗證碼進行針對訓練)。 一、製作訓練數據集 我們可以把需要生成圖片的一些參數放在se ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...