我們在我工作的公司廣泛使用 Plotly 圖表。它們可以輕鬆創建看起來不錯的互動式圖形。透過 Plotly Express 函式庫獲得的 Python 體驗非常棒,而且入門門檻很低。
Plotly 圖表有兩個主要用例:
- 使用 Plotly Dash 的互動式儀表板。將 Plotly 圖表整合到 Dash 中顯然很棒。
- 對於我們的 PDF 報告,我們在渲染 PDF 之前將圖表轉換為圖像。
對於典型的 PDF 報告,我們使用 5-20 個數字來顯示特定指標隨時間的演變、某些值在多個類別上的分佈,或不同類別之間的比較。
為了建立 PDF 報告,我們結合了 Weasyprint、Jinja 和 Plotly 圖表。要將報告呈現為 PDF,我們首先必須將所有圖表呈現為圖像。
使用 Kaleido 渲染圖表
為此,我們使用了很棒的 Kaleido 包。它使用 Chrome 瀏覽器渲染圖形並將其儲存為圖像。該 API 易於使用。
from kaleido.scopes.plotly import PlotlyScope scope = PlotlyScope() img_bytes = scope.transform( figure=figure, format="png", width=1000, height=1000, scale=4, )
這會將圖中的圖形渲染為高度和寬度為 1000 像素、渲染比例為 4 的圖像(即圖像實際尺寸為 4000 像素 x 4000 像素)。比例越高,最終影像的 DPI 越高,看起來越好,最終的 PDF 也越大。
渲染大量圖表
渲染圖表需要一點時間,如果您渲染大量圖表(10-20),它將佔用程式運行時間的很大一部分。為了加快 PDF 渲染管道的速度,我們部署了以下解決方案。
在內部,Kaleido 只是將圖形渲染為圖像的問題外包給附帶的 Chrome 網路瀏覽器。這意味著,對於Python本身來說,渲染這個影像基本上是在等待I/O。
為了加速這個特定的過程,並且由於我們只是等待 I/O,所以我們可以使用多執行緒。
創建隨機圖
讓我們先建立一個隨機圖形,如下所示:
import pandas as pd import numpy as np import plotly.graph_objects as go def get_random_figure() -> go.Figure: n_bars = 50 dates = pd.date_range(start="2021-01-01", end="2021-12-31", freq="M") figure = go.Figure() for i in range(n_bars): values = np.random.rand(len(dates)) figure.add_trace(go.Bar(x=dates, y=values, name=f"Label {i+1}")) figure.update_layout( dict( barmode="group", legend=dict(orientation="h", yanchor="top", xanchor="left"), ) ) figure.update_layout(yaxis=dict(tickformat=".0%"), xaxis=dict(showgrid=False)) return figure
現在,可以使用上面的程式碼將圖形轉換為圖像:
from kaleido.scopes.plotly import PlotlyScope import plotly.graph_objects as go def figure_to_bytes(figure: go.Figure) -> bytes: scope = PlotlyScope() return scope.transform(figure=figure, format="png", width=1000, height=1000, scale=4)
最後我們也為以後定義:
def transform_random_figure() -> bytes: return figure_to_bytes(get_random_figure())
在線程中運行圖像轉換
你可能知道,也可能不知道,由於Python中的GIL(全域解釋器鎖定),只有一個執行緒可以同時執行Python程式碼。由於圖到影像的轉換不是Python程式碼,因此我們可以利用執行緒同時啟動大量圖的轉換,然後收集結果。
為此,我們定義了一個輔助類別:
from kaleido.scopes.plotly import PlotlyScope scope = PlotlyScope() img_bytes = scope.transform( figure=figure, format="png", width=1000, height=1000, scale=4, )
這個類別將幫助我們檢索轉換的結果(即影像的位元組)。
接下來我們要做的就是遵循在 Python 中使用執行緒的標準模式:
- 使用start()方法啟動你想要啟動的執行緒。
- 使用join()方法等待執行緒傳回結果。
我們的執行緒應該每個呼叫transform_random_figure(),然後返回位元組。在本例中我們啟動 10 個執行緒。
import pandas as pd import numpy as np import plotly.graph_objects as go def get_random_figure() -> go.Figure: n_bars = 50 dates = pd.date_range(start="2021-01-01", end="2021-12-31", freq="M") figure = go.Figure() for i in range(n_bars): values = np.random.rand(len(dates)) figure.add_trace(go.Bar(x=dates, y=values, name=f"Label {i+1}")) figure.update_layout( dict( barmode="group", legend=dict(orientation="h", yanchor="top", xanchor="left"), ) ) figure.update_layout(yaxis=dict(tickformat=".0%"), xaxis=dict(showgrid=False)) return figure
start()方法也會呼叫啟動實際邏輯的執行緒的run()方法(即執行給定的函數,在我們的例子中意味著transform_random_figure())。
為了收集結果,我們使用執行緒的 join() 方法並將結果寫入檔案。
from kaleido.scopes.plotly import PlotlyScope import plotly.graph_objects as go def figure_to_bytes(figure: go.Figure) -> bytes: scope = PlotlyScope() return scope.transform(figure=figure, format="png", width=1000, height=1000, scale=4)
它是如何運作的
這裡的主要思想是,每當我們想要將圖形轉換為圖像時,我們都會啟動一個線程,並且該線程將在後台等待圖形完成。
將整個報告放在一起後,我們在所有執行緒上呼叫 join() 並檢索所有圖形的圖像,然後將它們放入報告中。
這樣,我們就可以產生沒有圖表的整個報告,並且無需等待每個圖表本身都被轉換,從而節省時間。
概括
綜上所述,如果您想將多個 Plotly 圖表轉換為映像,請使用 Python 標準庫中的多執行緒模組來加快轉換過程。
您可以非常輕鬆地做到這一點,只需將 transform() 呼叫移到一個執行緒中,然後等待所有執行緒完成即可。
附錄:守則
def transform_random_figure() -> bytes: return figure_to_bytes(get_random_figure())
以上是將 Plotly 圖表並行轉換為影像的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

本文解釋瞭如何使用美麗的湯庫來解析html。 它詳細介紹了常見方法,例如find(),find_all(),select()和get_text(),以用於數據提取,處理不同的HTML結構和錯誤以及替代方案(SEL)

Python 對象的序列化和反序列化是任何非平凡程序的關鍵方面。如果您將某些內容保存到 Python 文件中,如果您讀取配置文件,或者如果您響應 HTTP 請求,您都會進行對象序列化和反序列化。 從某種意義上說,序列化和反序列化是世界上最無聊的事情。誰會在乎所有這些格式和協議?您想持久化或流式傳輸一些 Python 對象,並在以後完整地取回它們。 這是一種在概念層面上看待世界的好方法。但是,在實際層面上,您選擇的序列化方案、格式或協議可能會決定程序運行的速度、安全性、維護狀態的自由度以及與其他系

Python的statistics模塊提供強大的數據統計分析功能,幫助我們快速理解數據整體特徵,例如生物統計學和商業分析等領域。無需逐個查看數據點,只需查看均值或方差等統計量,即可發現原始數據中可能被忽略的趨勢和特徵,並更輕鬆、有效地比較大型數據集。 本教程將介紹如何計算平均值和衡量數據集的離散程度。除非另有說明,本模塊中的所有函數都支持使用mean()函數計算平均值,而非簡單的求和平均。 也可使用浮點數。 import random import statistics from fracti

本文比較了Tensorflow和Pytorch的深度學習。 它詳細介紹了所涉及的步驟:數據準備,模型構建,培訓,評估和部署。 框架之間的關鍵差異,特別是關於計算刻度的

該教程建立在先前對美麗湯的介紹基礎上,重點是簡單的樹導航之外的DOM操縱。 我們將探索有效的搜索方法和技術,以修改HTML結構。 一種常見的DOM搜索方法是EX

本文指導Python開發人員構建命令行界面(CLIS)。 它使用Typer,Click和ArgParse等庫詳細介紹,強調輸入/輸出處理,並促進用戶友好的設計模式,以提高CLI可用性。

本文討論了諸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和請求等流行的Python庫,並詳細介紹了它們在科學計算,數據分析,可視化,機器學習,網絡開發和H中的用途


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

禪工作室 13.0.1
強大的PHP整合開發環境