溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python中如何使用Plotly實現(xiàn)數(shù)據(jù)可視化

發(fā)布時間:2022-06-01 11:28:42 來源:億速云 閱讀:148 作者:zzz 欄目:大數(shù)據(jù)

這篇文章主要講解了“Python中如何使用Plotly實現(xiàn)數(shù)據(jù)可視化”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python中如何使用Plotly實現(xiàn)數(shù)據(jù)可視化”吧!

 Plotly 是一個數(shù)據(jù)繪圖庫,具有整潔的接口,它旨在允許你構(gòu)建自己的 API。

Plotly 是一個繪圖生態(tài)系統(tǒng),可以讓你在 Python 以及 JavaScript 和 R 中進(jìn)行繪圖。

Plotly 有三種不同的 Python API,你可以選擇不同的方法來使用它:

  • 類似于 Matplotlib 的面向?qū)ο蟮?API

  • 數(shù)據(jù)驅(qū)動的 API,通過構(gòu)造類似 JSON 的數(shù)據(jù)結(jié)構(gòu)來定義繪圖

  • 類似于 Seaborn 的高級繪圖接口,稱為 “Plotly Express” API

我將通過使用每個 API 來繪制相同的圖來探索它們:英國大選結(jié)果的分組柱狀圖。

在我們進(jìn)一步探討之前,請注意,你可能需要調(diào)整你的 Python 環(huán)境來讓這段代碼運行,包括以下內(nèi)容:

  • 運行最新版本的Python(Linux、Mac 和 Windows 的說明)

  • 確認(rèn)你運行的 Python 版本能與這些庫一起工作

數(shù)據(jù)可在線獲得,可以用 Pandas 導(dǎo)入。

import pandas as pddf = pd.read_csv('https://anvil.works/blog/img/plotting-in-python/uk-election-results.csv')

現(xiàn)在我們可以繼續(xù)進(jìn)行了。

使用圖對象來繪制圖

Plotly 面向?qū)ο蟮?API 被稱為 graph_objects,它有點類似于 Matplotlib 的面向?qū)ο?API。

要創(chuàng)建一個柱狀圖,你可以構(gòu)造一個包含四個柱狀圖的對象:

# 導(dǎo)入 Plotly 和數(shù)據(jù)import plotly.graph_objects as gofrom votes import wide as df # 得到 x 列表years = df['year']x = list(range(len(years))) # 定義繪圖bar_plots = [  go.Bar(x=x, y=df['conservative'], name='Conservative', marker=go.bar.Marker(color='#0343df')),  go.Bar(x=x, y=df['labour'], name='Labour', marker=go.bar.Marker(color='#e50000')),  go.Bar(x=x, y=df['liberal'], name='Liberal', marker=go.bar.Marker(color='#ffff14')),  go.Bar(x=x, y=df['others'], name='Others', marker=go.bar.Marker(color='#929591')),] # 指定樣式layout = go.Layout(  title=go.layout.Title(text="Election results", x=0.5),  yaxis_title="Seats",  xaxis_tickmode="array",  xaxis_tickvals=list(range(27)),  xaxis_ticktext=tuple(df['year'].values),)   # 繪制柱狀圖fig = go.Figure(data=bar_plots, layout=layout) # 告訴 Plotly 去渲染fig.show()

與 Matplotlib 不同的是,你無需手動計算柱狀圖的 x 軸位置,Plotly 會幫你適配。

使用 Python 數(shù)據(jù)結(jié)構(gòu)來繪圖

你還可以使用 Python 基本數(shù)據(jù)結(jié)構(gòu)來定義繪圖,它與面對對象 API 具有相同的結(jié)構(gòu)。這直接對應(yīng)于 Plotly 的 JavaScript 實現(xiàn)的 JSON API。

# 定義繪圖數(shù)據(jù)fig = {    'data': [        {'type': 'bar', 'x': x, 'y': df['conservative'], 'name': 'Conservative', 'marker': {'color': '#0343df'}},        {'type': 'bar', 'x': x, 'y': df['labour'], 'name': 'Labour', 'marker': {'color': '#e50000'}},        {'type': 'bar', 'x': x, 'y': df['liberal'], 'name': 'Liberal', 'marker': {'color': '#ffff14'}},        {'type': 'bar', 'x': x, 'y': df['others'], 'name': 'Others', 'marker': {'color': '#929591'}},    ],    'layout': {        'title': {'text': 'Election results', 'x': 0.5},        'yaxis': {'title': 'Seats'},        'xaxis': {            'tickmode': 'array',            'tickvals': list(range(27)),            'ticktext': tuple(df['year'].values),        }    }} # 告訴 Plotly 去渲染它pio.show(fig)
使用 Plotly Express 進(jìn)行繪圖

Plotly Express 是對圖對象進(jìn)行封裝的高級 API。

你可以使用一行代碼來繪制柱狀圖:

# 導(dǎo)入 Plotly 和數(shù)據(jù)import plotly.express as pxfrom votes import long as df # 定義顏色字典獲得自定義欄顏色cmap = {    'Conservative': '#0343df',    'Labour': '#e50000',    'Liberal': '#ffff14',    'Others': '#929591',} # 生成圖fig = px.bar(df, x="year", y="seats", color="party", barmode="group", color_discrete_map=cmap)

這里使用了 數(shù)據(jù),也稱為“整潔數(shù)據(jù)”。這些列代表年份、政黨和席位,而不是按政黨劃分。這與在 Seaborn 中制作柱狀圖非常相似。

>> print(long)     year         party  seats0    1922  Conservative    3441    1923  Conservative    2582    1924  Conservative    4123    1929  Conservative    2604    1931  Conservative    470..    ...           ...    ...103  2005        Others     30104  2010        Others     29105  2015        Others     80106  2017        Others     59107  2019        Others     72 [108 rows x 3 columns]

你可以訪問底層的圖對象 API 進(jìn)行詳細(xì)調(diào)整。如添加標(biāo)題和 y 軸標(biāo)簽:

# 使用圖對象 API 來調(diào)整繪圖import plotly.graph_objects as gofig.layout = go.Layout(    title=go.layout.Title(text="Election results", x=0.5),    yaxis_title="Seats",)

最后,讓 Plotly 渲染:

fig.show()

這將在未使用的端口上運行一個臨時 Web 服務(wù)器,并打開默認(rèn)的 Web 瀏覽器來查看圖像(Web 服務(wù)器將會馬上被關(guān)閉)。

不幸的是,結(jié)果并不完美。x 軸被視為整數(shù),因此兩組之間的距離很遠(yuǎn)且很小,這使得我們很難看到趨勢。

Python中如何使用Plotly實現(xiàn)數(shù)據(jù)可視化

你可能會嘗試通過將 x 值轉(zhuǎn)換為字符串來使 Plotly Express 將其視為字符串,這樣它就會以均勻的間隔和詞法順序來繪制。不幸的是,它們的間隔還是很大,像在 graph_objects中那樣設(shè)置 xaxis_tickvals 也不行。

與 Seaborn 中的類似示例不同,在這種情況下,抽象似乎沒有提供足夠的應(yīng)急方案來提供你想要的東西,但是也許你可以編寫自己的 API?

構(gòu)建自己的 Plotly API

對 Plotly 的操作方式不滿意?那就構(gòu)建自己的 Plotly API!

Plotly 的核心是一個 JavaScript 庫,它使用 D3 和 stack.gl 進(jìn)行繪圖。JavaScript 庫的接口使用指定的 JSON 結(jié)構(gòu)來繪圖。因此,你只需要輸出 JavaScript 庫喜歡使用的 JSON 結(jié)構(gòu)就好了。

Anvil 這樣做是為了創(chuàng)建一個完全在瀏覽器中工作的 Python Plotly API。

Python中如何使用Plotly實現(xiàn)數(shù)據(jù)可視化

Plotly uses a JavaScript library to create plots, driven by libraries in other languages via JSON (© 2019 Anvil)

在 Anvil 版本中,你可以同時使用圖對象 API 和上面介紹的 Python 數(shù)據(jù)結(jié)構(gòu)方法。運行完全相同的命令,將數(shù)據(jù)和布局分配給 Anvil 應(yīng)用程序中的 Plot 組件。

這是用 Anvil 的客戶端 Python API 繪制的多列柱狀圖:

# 導(dǎo)入 Anvil 庫from ._anvil_designer import EntrypointTemplatefrom anvil import *import anvil.server # 導(dǎo)入客戶端 Plotlyimport plotly.graph_objs as go # 這是一個 Anvil 表單class Entrypoint(EntrypointTemplate):  def __init__(self, **properties):    # Set Form properties and Data Bindings.    self.init_components(**properties)     # 從服務(wù)器獲取數(shù)據(jù)    data = anvil.server.call('get_election_data')       # 獲取一個方便的 x 值列表    years = data['year']    x = list(range(len(years)))     # 定義繪圖    bar_plots = [      go.Bar(x=x, y=data['conservative'], name='Conservative', marker=go.Marker(color='#0343df')),      go.Bar(x=x, y=data['labour'], name='Labour', marker=go.Marker(color='#e50000')),      go.Bar(x=x, y=data['liberal'], name='Liberal', marker=go.Marker(color='#ffff14')),      go.Bar(x=x, y=data['others'], name='Others', marker=go.Marker(color='#929591')),    ]    # 規(guī)定布局    layout = {      'title': 'Election results',      'yaxis': {'title': 'Seats'},      'xaxis': {        'tickmode': 'array',        'tickvals': list(range(27)),        'ticktext': data['year'],      },    }     # 生成多列柱狀圖    self.plot_1.data = bar_plots    self.plot_1.layout = layout

繪圖邏輯與上面相同,但是它完全在 Web 瀏覽器中運行,繪圖是由用戶計算機上的 Plotly JavaScript 庫完成的!與本系列的所有其它 Python 繪圖庫相比,這是一個很大的優(yōu)勢。因為其它 Python 庫都需要在服務(wù)器上運行。

這是在 Anvil 應(yīng)用中運行的交互式 Plotly 圖:

Python中如何使用Plotly實現(xiàn)數(shù)據(jù)可視化

The election plot on the web using Anvil's client-side-Python Plotly library (© 2019 Anvil)

你可以復(fù)制此示例作為一個 Anvil 應(yīng)用程序(注意:Anvil 需要注冊才能使用)。

在前端運行 Plotly 還有另一個優(yōu)勢:它為自定義交互行為提供了更多選項。

在 Plotly 中自定義交互

Plotly 繪圖不僅是動態(tài)的,你可以自定義它們的互動行為。例如,你可以在每個柱狀圖中使用 hovertemplate 自定義工具提示的格式:

    go.Bar(      x=x,      y=df['others'],      name='others',      marker=go.bar.Marker(color='#929591'),      hovertemplate='Seats: <b>%{y}</b>',    ),

當(dāng)你把這個應(yīng)用到每個柱狀圖時,你會看到以下結(jié)果:

Python中如何使用Plotly實現(xiàn)數(shù)據(jù)可視化

這很有用,當(dāng)你想要在某些事件發(fā)生時執(zhí)行任何你想要的代碼就更好了(例如,當(dāng)用戶將鼠標(biāo)懸停在欄上,你想要顯示一個相關(guān)選舉的信息框)。在 Anvil 的 Plotly 庫中,你可以將事件處理程序綁定到諸如懸停之類的事件,這使得復(fù)雜的交互成為可能。

Python中如何使用Plotly實現(xiàn)數(shù)據(jù)可視化

你可以通過將方法綁定到繪圖的懸停事件來實現(xiàn):

  def plot_1_hover(self, points, **event_args):    """This method is called when a data point is hovered."""    i = points[0]['point_number']    self.label_year.text = self.data['year'][i]    self.label_con.text = self.data['conservative'][i]    self.label_lab.text = self.data['labour'][i]    self.label_lib.text = self.data['liberal'][i]    self.label_oth.text = self.data['others'][i]    url = f"https://en.wikipedia.org/wiki/{self.data['year'][i]}_United_Kingdom_general_election"    self.link_more_info.text = url    self.link_more_info.url = url

感謝各位的閱讀,以上就是“Python中如何使用Plotly實現(xiàn)數(shù)據(jù)可視化”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Python中如何使用Plotly實現(xiàn)數(shù)據(jù)可視化這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI