国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 后端開發(fā) Python教程 將 Plotly 圖表并行轉(zhuǎn)換為圖像

將 Plotly 圖表并行轉(zhuǎn)換為圖像

Jan 04, 2025 am 02:32 AM

Converting Plotly charts into images in parallel

我們?cè)谖夜ぷ鞯墓緩V泛使用 Plotly 圖表。它們可以輕松創(chuàng)建看起來不錯(cuò)的交互式圖形。通過 Plotly Express 庫獲得的 Python 體驗(yàn)非常棒,而且入門門檻很低。

Plotly 圖表有兩個(gè)主要用例:

  • 使用 Plotly Dash 的交互式儀表板。將 Plotly 圖表集成到 Dash 中顯然很棒。
  • 對(duì)于我們的 PDF 報(bào)告,我們?cè)阡秩?PDF 之前將圖表轉(zhuǎn)換為圖像。

對(duì)于典型的 PDF 報(bào)告,我們使用 5-20 個(gè)數(shù)字來顯示特定指標(biāo)隨時(shí)間的演變、某些值在多個(gè)類別上的分布,或者不同類別之間的比較。

為了創(chuàng)建 PDF 報(bào)告,我們結(jié)合使用了 Weasyprint、Jinja 和 Plotly 圖表。要將報(bào)告呈現(xiàn)為 PDF,我們首先必須將所有圖表呈現(xiàn)為圖像。

使用 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,
)

這會(huì)將圖中的圖形渲染為高度和寬度為 1000 像素、渲染比例為 4 的圖像(即圖像實(shí)際尺寸為 4000 像素 x 4000 像素)。比例越高,最終圖像的 DPI 越高,看起來越好,最終的 PDF 也越大。

渲染大量圖表

渲染圖表需要一點(diǎn)時(shí)間,如果您渲染大量圖表(10-20),它將占用程序運(yùn)行時(shí)間的很大一部分。為了加快 PDF 渲染管道的速度,我們部署了以下解決方案。

在內(nèi)部,Kaleido 只是將將圖形渲染為圖像的問題外包給附帶的 Chrome 網(wǎng)絡(luò)瀏覽器。這意味著,對(duì)于Python本身來說,渲染這個(gè)圖像基本上是在等待I/O。

為了加速這個(gè)特定的過程,并且由于我們只是等待 I/O,所以我們可以使用多線程。

創(chuàng)建隨機(jī)圖

讓我們首先創(chuàng)建一個(gè)隨機(jī)圖形,如下所示:

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

現(xiàn)在,可以使用上面的代碼將圖形轉(zhuǎn)換為圖像:

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())

在線程中運(yùn)行圖像轉(zhuǎn)換

你可能知道,也可能不知道,由于Python中的GIL(全局解釋器鎖),只有一個(gè)線程可以同時(shí)執(zhí)行Python代碼。由于圖到圖像的轉(zhuǎn)換不是Python代碼,因此我們可以利用線程同時(shí)啟動(dòng)大量圖的轉(zhuǎn)換,然后收集結(jié)果。

為此,我們定義了一個(gè)輔助類:

from kaleido.scopes.plotly import PlotlyScope

scope = PlotlyScope()
img_bytes = scope.transform(
    figure=figure, format="png", width=1000, height=1000, scale=4,
)

這個(gè)類將幫助我們檢索轉(zhuǎn)換的結(jié)果(即圖像的字節(jié))。

接下來我們要做的就是遵循在 Python 中使用線程的標(biāo)準(zhǔn)模式:

  1. 使用start()方法啟動(dòng)你想要啟動(dòng)的線程。
  2. 使用join()方法等待線程返回結(jié)果。

我們的線程應(yīng)該每個(gè)調(diào)用transform_random_figure(),然后返回字節(jié)。在本例中我們啟動(dòng) 10 個(gè)線程。

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()方法還將調(diào)用啟動(dòng)實(shí)際邏輯的線程的run()方法(即執(zhí)行給定的函數(shù),在我們的例子中意味著transform_random_figure())。

為了收集結(jié)果,我們使用線程的 join() 方法并將結(jié)果寫入文件。

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)

它是如何運(yùn)作的

這里的主要思想是,每當(dāng)我們想要將圖形轉(zhuǎn)換為圖像時(shí),我們都會(huì)啟動(dòng)一個(gè)線程,并且該線程將在后臺(tái)等待圖形完成。

將整個(gè)報(bào)告放在一起后,我們?cè)谒芯€程上調(diào)用 join() 并檢索所有圖形的圖像,然后將它們放入報(bào)告中。

這樣,我們就可以生成沒有圖表的整個(gè)報(bào)告,并且無需等待每個(gè)圖表本身都被轉(zhuǎn)換,從而節(jié)省時(shí)間。

概括

綜上所述,如果您想將多個(gè) Plotly 圖表轉(zhuǎn)換為圖像,請(qǐng)使用 Python 標(biāo)準(zhǔn)庫中的多線程模塊來加快轉(zhuǎn)換過程。

您可以非常輕松地做到這一點(diǎn),只需將 transform() 調(diào)用移動(dòng)到一個(gè)線程中,然后等待所有線程完成即可。

附錄:守則

def transform_random_figure() -> bytes:
    return figure_to_bytes(get_random_figure())

以上是將 Plotly 圖表并行轉(zhuǎn)換為圖像的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

什么是動(dòng)態(tài)編程技術(shù),如何在Python中使用它們? 什么是動(dòng)態(tài)編程技術(shù),如何在Python中使用它們? Jun 20, 2025 am 12:57 AM

動(dòng)態(tài)規(guī)劃(DP)通過將復(fù)雜問題分解為更簡單的子問題并存儲(chǔ)其結(jié)果以避免重復(fù)計(jì)算,來優(yōu)化求解過程。主要方法有兩種:1.自頂向下(記憶化):遞歸分解問題,使用緩存存儲(chǔ)中間結(jié)果;2.自底向上(表格化):從基礎(chǔ)情況開始迭代構(gòu)建解決方案。適用于需要最大/最小值、最優(yōu)解或存在重疊子問題的場(chǎng)景,如斐波那契數(shù)列、背包問題等。在Python中,可通過裝飾器或數(shù)組實(shí)現(xiàn),并應(yīng)注意識(shí)別遞推關(guān)系、定義基準(zhǔn)情況及優(yōu)化空間復(fù)雜度。

如何使用插座在Python中執(zhí)行網(wǎng)絡(luò)編程? 如何使用插座在Python中執(zhí)行網(wǎng)絡(luò)編程? Jun 20, 2025 am 12:56 AM

Python的socket模塊是網(wǎng)絡(luò)編程的基礎(chǔ),提供低級(jí)網(wǎng)絡(luò)通信功能,適用于構(gòu)建客戶端和服務(wù)器應(yīng)用。要設(shè)置基本TCP服務(wù)器,需使用socket.socket()創(chuàng)建對(duì)象,綁定地址和端口,調(diào)用.listen()監(jiān)聽連接,并通過.accept()接受客戶端連接。構(gòu)建TCP客戶端需創(chuàng)建socket對(duì)象后調(diào)用.connect()連接服務(wù)器,再使用.sendall()發(fā)送數(shù)據(jù)和.recv()接收響應(yīng)。處理多個(gè)客戶端可通過1.線程:每次連接啟動(dòng)新線程;2.異步I/O:如asyncio庫實(shí)現(xiàn)無阻塞通信。注意事

如何在Python中切片列表? 如何在Python中切片列表? Jun 20, 2025 am 12:51 AM

Python列表切片的核心答案是掌握[start:end:step]語法并理解其行為。1.列表切片的基本格式為list[start:end:step],其中start是起始索引(包含)、end是結(jié)束索引(不包含)、step是步長;2.省略start默認(rèn)從0開始,省略end默認(rèn)到末尾,省略step默認(rèn)為1;3.獲取前n項(xiàng)用my_list[:n],獲取后n項(xiàng)用my_list[-n:];4.使用step可跳過元素,如my_list[::2]取偶數(shù)位,負(fù)step值可反轉(zhuǎn)列表;5.常見誤區(qū)包括end索引不

如何使用DateTime模塊在Python中使用日期和時(shí)間? 如何使用DateTime模塊在Python中使用日期和時(shí)間? Jun 20, 2025 am 12:58 AM

Python的datetime模塊能滿足基本的日期和時(shí)間處理需求。1.可通過datetime.now()獲取當(dāng)前日期和時(shí)間,也可分別提取.date()和.time()。2.能手動(dòng)創(chuàng)建特定日期時(shí)間對(duì)象,如datetime(year=2025,month=12,day=25,hour=18,minute=30)。3.使用.strftime()按格式輸出字符串,常見代碼包括%Y、%m、%d、%H、%M、%S;用strptime()將字符串解析為datetime對(duì)象。4.利用timedelta進(jìn)行日期運(yùn)

Python類中的多態(tài)性 Python類中的多態(tài)性 Jul 05, 2025 am 02:58 AM

多態(tài)是Python面向?qū)ο缶幊讨械暮诵母拍?,指“一種接口,多種實(shí)現(xiàn)”,允許統(tǒng)一處理不同類型的對(duì)象。1.多態(tài)通過方法重寫實(shí)現(xiàn),子類可重新定義父類方法,如Animal類的speak()方法在Dog和Cat子類中有不同實(shí)現(xiàn)。2.多態(tài)的實(shí)際用途包括簡化代碼結(jié)構(gòu)、增強(qiáng)可擴(kuò)展性,例如圖形繪制程序中統(tǒng)一調(diào)用draw()方法,或游戲開發(fā)中處理不同角色的共同行為。3.Python實(shí)現(xiàn)多態(tài)需滿足:父類定義方法,子類重寫該方法,但不要求繼承同一父類,只要對(duì)象實(shí)現(xiàn)相同方法即可,這稱為“鴨子類型”。4.注意事項(xiàng)包括保持方

我如何寫一個(gè)簡單的'你好,世界!” Python的程序? 我如何寫一個(gè)簡單的'你好,世界!” Python的程序? Jun 24, 2025 am 12:45 AM

"Hello,World!"程序是用Python編寫的最基礎(chǔ)示例,用于展示基本語法并驗(yàn)證開發(fā)環(huán)境是否正確配置。1.它通過一行代碼print("Hello,World!")實(shí)現(xiàn),運(yùn)行后會(huì)在控制臺(tái)輸出指定文本;2.運(yùn)行步驟包括安裝Python、使用文本編輯器編寫代碼、保存為.py文件、在終端執(zhí)行該文件;3.常見錯(cuò)誤有遺漏括號(hào)或引號(hào)、誤用大寫Print、未保存為.py格式以及運(yùn)行環(huán)境錯(cuò)誤;4.可選工具包括本地文本編輯器 終端、在線編輯器(如replit.com)

Python中有哪些元素,它們與列表有何不同? Python中有哪些元素,它們與列表有何不同? Jun 20, 2025 am 01:00 AM

TuplesinPythonareimmutabledatastructuresusedtostorecollectionsofitems,whereaslistsaremutable.Tuplesaredefinedwithparenthesesandcommas,supportindexing,andcannotbemodifiedaftercreation,makingthemfasterandmorememory-efficientthanlists.Usetuplesfordatain

如何在Python中產(chǎn)生隨機(jī)字符串? 如何在Python中產(chǎn)生隨機(jī)字符串? Jun 21, 2025 am 01:02 AM

要生成隨機(jī)字符串,可以使用Python的random和string模塊組合。具體步驟為:1.導(dǎo)入random和string模塊;2.定義字符池如string.ascii_letters和string.digits;3.設(shè)定所需長度;4.調(diào)用random.choices()生成字符串。例如代碼包括importrandom與importstring、設(shè)置length=10、characters=string.ascii_letters string.digits并執(zhí)行''.join(random.c

See all articles