成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用Plotly來簡化Python中的數據可視化

開發 后端
Plotly 是一個繪圖生態系統,可以讓你在 Python 以及 JavaScript 和 R 中進行繪圖。在本文中,我將重點介紹使用 Python 庫進行繪圖。

 [[331588]]

Plotly 是一個數據繪圖庫,具有整潔的接口,它旨在允許你構建自己的 API。

Plotly 是一個繪圖生態系統,可以讓你在 Python 以及 JavaScript 和 R 中進行繪圖。在本文中,我將重點介紹使用 Python 庫進行繪圖

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

  • 類似于 Matplotlib 的面向對象的 API
  • 數據驅動的 API,通過構造類似 JSON 的數據結構來定義繪圖
  • 類似于 Seaborn 的高級繪圖接口,稱為 “Plotly Express” API

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

在我們進一步探討之前,請注意,你可能需要調整你的 Python 環境來讓這段代碼運行,包括以下內容:

  • 運行最新版本的Python(LinuxMac 和 Windows 的說明)
  • 確認你運行的 Python 版本能與這些庫一起工作

數據可在線獲得,可以用 Pandas 導入。

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

現在我們可以繼續進行了。

使用圖對象來繪制圖

Plotly 面向對象的 API 被稱為 graph_objects,它有點類似于 Matplotlib 的面向對象 API

要創建一個柱狀圖,你可以構造一個包含四個柱狀圖的對象:

  1. # 導入 Plotly 和數據
  2. import plotly.graph_objects as go
  3. from votes import wide as df
  4.  
  5. # 得到 x 列表
  6. years = df['year']
  7. x = list(range(len(years)))
  8.  
  9. # 定義繪圖
  10. bar_plots = [
  11.   go.Bar(x=x, y=df['conservative'], name='Conservative', marker=go.bar.Marker(color='#0343df')),
  12.   go.Bar(x=x, y=df['labour'], name='Labour', marker=go.bar.Marker(color='#e50000')),
  13.   go.Bar(x=x, y=df['liberal'], name='Liberal', marker=go.bar.Marker(color='#ffff14')),
  14.   go.Bar(x=x, y=df['others'], name='Others', marker=go.bar.Marker(color='#929591')),
  15. ]
  16.  
  17. # 指定樣式
  18. layout = go.Layout(
  19.   title=go.layout.Title(text="Election results", x=0.5),
  20.   yaxis_title="Seats",
  21.   xaxis_tickmode="array",
  22.   xaxis_tickvals=list(range(27)),
  23.   xaxis_ticktext=tuple(df['year'].values),
  24. )
  25.    
  26. # 繪制柱狀圖
  27. fig = go.Figure(data=bar_plots, layout=layout)
  28.  
  29. # 告訴 Plotly 去渲染
  30. fig.show()

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

最終結果圖:

A multi-bar plot made using Graph Objects (© 2019 Anvil)

使用 Python 數據結構來繪圖

你還可以使用 Python 基本數據結構來定義繪圖,它與面對對象 API 具有相同的結構。這直接對應于 Plotly 的 JavaScript 實現的 JSON API。

  1. # 定義繪圖數據
  2. fig = {
  3.     'data': [
  4.         {'type': 'bar', 'x': x, 'y': df['conservative'], 'name': 'Conservative', 'marker': {'color': '#0343df'}},
  5.         {'type': 'bar', 'x': x, 'y': df['labour'], 'name': 'Labour', 'marker': {'color': '#e50000'}},
  6.         {'type': 'bar', 'x': x, 'y': df['liberal'], 'name': 'Liberal', 'marker': {'color': '#ffff14'}},
  7.         {'type': 'bar', 'x': x, 'y': df['others'], 'name': 'Others', 'marker': {'color': '#929591'}},
  8.     ],
  9.     'layout': {
  10.         'title': {'text': 'Election results', 'x': 0.5},
  11.         'yaxis': {'title': 'Seats'},
  12.         'xaxis': {
  13.             'tickmode': 'array',
  14.             'tickvals': list(range(27)),
  15.             'ticktext': tuple(df['year'].values),
  16.         }
  17.     }
  18. }
  19.  
  20. # 告訴 Plotly 去渲染它
  21. pio.show(fig)

最終結果與上次完全相同:

A multi-bar plot made using JSON-like data structures (© 2019 Anvil)

使用 Plotly Express 進行繪圖

Plotly Express 是對圖對象進行封裝的高級 API。

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

  1. # 導入 Plotly 和數據
  2. import plotly.express as px
  3. from votes import long as df
  4.  
  5. # 定義顏色字典獲得自定義欄顏色
  6. cmap = {
  7.     'Conservative': '#0343df',
  8.     'Labour': '#e50000',
  9.     'Liberal': '#ffff14',
  10.     'Others': '#929591',
  11. }
  12.  
  13. # 生成圖
  14. fig = px.bar(df, x="year", y="seats", color="party", barmode="group", color_discrete_map=cmap)

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

  1. >> print(long)
  2.      year         party  seats
  3. 0    1922  Conservative    344
  4. 1    1923  Conservative    258
  5. 2    1924  Conservative    412
  6. 3    1929  Conservative    260
  7. 4    1931  Conservative    470
  8. ..    ...           ...    ...
  9. 103  2005        Others     30
  10. 104  2010        Others     29
  11. 105  2015        Others     80
  12. 106  2017        Others     59
  13. 107  2019        Others     72
  14.  
  15. [108 rows x 3 columns]

你可以訪問底層的圖對象 API 進行詳細調整。如添加標題和 y 軸標簽:

  1. # 使用圖對象 API 來調整繪圖
  2. import plotly.graph_objects as go
  3. fig.layout = go.Layout(
  4.     title=go.layout.Title(text="Election results", x=0.5),
  5.     yaxis_title="Seats",
  6. )

最后,讓 Plotly 渲染:

  1. fig.show()

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

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

A multi-bar plot made using Plotly Express (© 2019 Anvil)

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

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

構建自己的 Plotly API

對 Plotly 的操作方式不滿意?那就構建自己的 Plotly API!

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

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

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

在 Anvil 版本中,你可以同時使用圖對象 API 和上面介紹的 Python 數據結構方法。運行完全相同的命令,將數據和布局分配給 Anvil 應用程序中的 Plot 組件

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

  1. # 導入 Anvil
  2. from ._anvil_designer import EntrypointTemplate
  3. from anvil import *
  4. import anvil.server
  5.  
  6. # 導入客戶端 Plotly
  7. import plotly.graph_objs as go
  8.  
  9. # 這是一個 Anvil 表單
  10. class Entrypoint(EntrypointTemplate):
  11.   def __init__(self, **properties):
  12.     # Set Form properties and Data Bindings.
  13.     self.init_components(**properties)
  14.  
  15.     # 從服務器獲取數據
  16.     data = anvil.server.call('get_election_data')
  17.    
  18.     # 獲取一個方便的 x 值列表
  19.     years = data['year']
  20.     x = list(range(len(years)))
  21.  
  22.     # 定義繪圖
  23.     bar_plots = [
  24.       go.Bar(x=x, y=data['conservative'], name='Conservative', marker=go.Marker(color='#0343df')),
  25.       go.Bar(x=x, y=data['labour'], name='Labour', marker=go.Marker(color='#e50000')),
  26.       go.Bar(x=x, y=data['liberal'], name='Liberal', marker=go.Marker(color='#ffff14')),
  27.       go.Bar(x=x, y=data['others'], name='Others', marker=go.Marker(color='#929591')),
  28.     ]
  29.     # 規定布局
  30.     layout = {
  31.       'title': 'Election results',
  32.       'yaxis': {'title': 'Seats'},
  33.       'xaxis': {
  34.         'tickmode': 'array',
  35.         'tickvals': list(range(27)),
  36.         'ticktext': data['year'],
  37.       },
  38.     }
  39.  
  40.     # 生成多列柱狀圖
  41.     self.plot_1.data = bar_plots
  42.     self.plot_1.layout = layout

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

這是在 Anvil 應用中運行的交互式 Plotly 圖:

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

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

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

在 Plotly 中自定義交互

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

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

當你把這個應用到每個柱狀圖時,你會看到以下結果:

A multi-bar plot with custom tool-tips (© 2019 Anvil)

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

A multi-bar plot with a hover event handler (© 2019 Anvil)

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

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

這是一種相當極端的交互性,從開發人員的角度來看,也是一種極端的可定制性。這都要歸功于 Plotly 的架構 —— 它有一個簡潔的接口,明確的設計是為了讓你建立自己的API。如果到處都能看到這種偉大的設計,那將會很有幫助!

使用 Bokeh 進行自定義交互

現在你已經了解了 Plotly 如何使用 JavaScript 來創建動態圖,并且可以使用 Anvil 的客戶端編寫 Python 代碼在瀏覽器中實時編輯它們。

Bokeh 是另一個 Python 繪圖庫,它可以輸出可嵌入 Web 應用程序的 HTML 文檔,并獲得與 Plotly 提供的功能類似的動態功能(如果你想知道如何發音,那就是 “BOE-kay”)。 

 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2024-04-01 11:53:42

PlotlyPython數據可視化

2022-08-26 09:15:58

Python可視化plotly

2021-07-02 14:07:00

可視化Plotly漏斗圖

2024-07-11 16:16:27

ChatGPTLLM

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2015-08-20 10:00:45

可視化

2025-04-01 08:30:00

Plotly數據可視化數據分析

2017-06-19 08:30:35

大數據數據可視化報表

2021-10-11 08:04:22

Python數據行程

2021-08-30 11:40:06

PythonSeaborn可視化

2017-10-14 13:54:26

數據可視化數據信息可視化

2014-05-28 15:23:55

Rave

2024-03-07 09:00:04

Rust數據可視化

2022-07-10 21:17:01

GitTigLinux

2025-06-17 08:05:00

2017-10-31 09:38:53

大數據數據可視化Python

2020-03-23 14:55:52

Python可視化Plotly

2023-05-06 12:57:34

Python工具

2020-05-26 11:34:46

可視化WordCloud

2022-02-23 09:50:52

PythonEchartspyecharts
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品一区二区三区在线播放 | 欧美福利 | 黄片毛片在线观看 | 国产激情片在线观看 | 亚洲资源在线 | 久久99国产精一区二区三区 | 久久亚洲欧美日韩精品专区 | 国产日韩视频在线 | 日韩欧美在线视频播放 | 亚洲三区在线 | 日本字幕在线观看 | 中文字幕日韩一区二区 | 国产成人99久久亚洲综合精品 | 国产精品成人一区二区三区夜夜夜 | 成人在线视频观看 | 国产成人jvid在线播放 | 亚洲高清视频在线观看 | 91黄色免费看 | 天天搞天天搞 | 9191av| 日韩av一区二区在线观看 | 四季久久免费一区二区三区四区 | 中文字幕国产精品 | 97影院在线午夜 | 久久av一区二区三区 | 国产精品日本一区二区不卡视频 | 久草免费在线视频 | 天天久久| 日韩精品在线观看免费 | 日日草天天干 | 久久人体视频 | 欧美在线综合 | av免费成人 | 91精品国产91久久综合桃花 | 久综合 | 久久久久久久亚洲精品 | 欧美网站一区二区 | 中文字幕在线观看国产 | 日韩午夜在线观看 | 天天精品在线 | 精品国产乱码久久久久久蜜柚 |