2022年9月16日 星期五

Python 學習筆記 : 用 plotly 繪製互動式圖表 (一)

Plotly 是一個加拿大 Plotly 公司所開發的繪圖套件, 提供以瀏覽器為基礎的互動式線上繪圖與統計分析功能 (與 Bokeh 類似), 可繪製超過 30 種的圖形, 涵蓋統計, 科學, 3D, 以及 SVG, 並能直接使用 Pandas 的 DataFrame 型態資料繪圖, 所繪製之圖形可在 HTML 網頁或 Jypyter Notebook 中呈現, 也可以與 Plotly 公司開發的 Dash 儀錶板套件整合. 除了 Python 外還支援 R, Julia, Matlab 等程式語言, 參考 : 


Plotly 是免費與開放原始碼套件 (採 MIT 授權), 無須註冊也不用申請 token, 只要安裝即可免費使用 (沒有連上 Internet 也可使用), 其原始碼寄存於 GitHub :


參考書籍 : 



1. 安裝 plotly : 

用 pip install 指令在終端機命令列安裝 plotly :

pip install plotly 

C:\Users\User>pip install plotly    
Collecting plotly
  Downloading plotly-5.10.0-py2.py3-none-any.whl (15.2 MB)
     ---------------------------------------- 15.2/15.2 MB 7.3 MB/s eta 0:00:00
Requirement already satisfied: tenacity>=6.2.0 in c:\python37\lib\site-packages (from plotly) (8.0.1)
Installing collected packages: plotly
Successfully installed plotly-5.10.0

安裝 Plotly 公司的 dash 套件也會自動安裝 plotly. 


2. 檢視 plotly 成員 : 

先來檢視 plotly 套件的成員內容, 以下使用一個自訂模組 members, 其 list_members() 函式會列出模組或套件中的公開成員 (即屬性與方法), 參考 :

Python 學習筆記 : 檢視物件成員與取得變數名稱字串的方法

>>> import plotly     
>>> import members   
>>> members.list_members(plotly)    
colors <class 'module'>
data <class 'module'>
graph_objects <class 'module'>
graph_objs <class 'module'>
io <class 'module'>
offline <class 'module'>
tools <class 'module'>
utils <class 'module'>

可見 plotly 裡面包含了 8 個模組, 繪圖主要會用到 graph_objs 與 offline 模組, graph_objs 是 graph_objects 的簡名, 兩者是一樣的, Plotly 的各種圖形函式都放在此模組中 : 

>>> members.list_members(plotly.graph_objs)    
AngularAxis <class 'type'>
Annotation <class 'type'>
Annotations <class 'type'>
Bar <class 'type'>
Barpolar <class 'type'>
Box <class 'type'>
Candlestick <class 'type'>
Carpet <class 'type'>
Choropleth <class 'type'>
Choroplethmapbox <class 'type'>
ColorBar <class 'type'>
Cone <class 'type'>
Contour <class 'type'>
Contourcarpet <class 'type'>
Contours <class 'type'>
Data <class 'type'>
Densitymapbox <class 'type'>
ErrorX <class 'type'>
ErrorY <class 'type'>
ErrorZ <class 'type'>
Figure <class 'type'>
FigureWidget <class 'type'>
Font <class 'type'>
Frame <class 'type'>
Frames <class 'type'>
Funnel <class 'type'>
Funnelarea <class 'type'>
Heatmap <class 'type'>
Heatmapgl <class 'type'>
Histogram <class 'type'>
Histogram2d <class 'type'>
Histogram2dContour <class 'type'>
Histogram2dcontour <class 'type'>
Icicle <class 'type'>
Image <class 'type'>
Indicator <class 'type'>
Isosurface <class 'type'>
Layout <class 'type'>
Legend <class 'type'>
Line <class 'type'>
Margin <class 'type'>
Marker <class 'type'>
Mesh3d <class 'type'>
Ohlc <class 'type'>
Parcats <class 'type'>
Parcoords <class 'type'>
Pie <class 'type'>
Pointcloud <class 'type'>
RadialAxis <class 'type'>
Sankey <class 'type'>
Scatter <class 'type'>
Scatter3d <class 'type'>
Scattercarpet <class 'type'>
Scattergeo <class 'type'>
Scattergl <class 'type'>
Scattermapbox <class 'type'>
Scatterpolar <class 'type'>
Scatterpolargl <class 'type'>
Scattersmith <class 'type'>
Scatterternary <class 'type'>
Scene <class 'type'>
Splom <class 'type'>
Stream <class 'type'>
Streamtube <class 'type'>
Sunburst <class 'type'>
Surface <class 'type'>
Table <class 'type'>
Trace <class 'type'>
Treemap <class 'type'>
Violin <class 'type'>
Volume <class 'type'>
Waterfall <class 'type'>
XAxis <class 'type'>
XBins <class 'type'>
YAxis <class 'type'>
YBins <class 'type'>
ZAxis <class 'type'>
bar <class 'module'>
barpolar <class 'module'>
box <class 'module'>
candlestick <class 'module'>
carpet <class 'module'>
choropleth <class 'module'>
choroplethmapbox <class 'module'>
cone <class 'module'>
contour <class 'module'>
contourcarpet <class 'module'>
densitymapbox <class 'module'>
funnel <class 'module'>
funnelarea <class 'module'>
heatmap <class 'module'>
heatmapgl <class 'module'>
histogram <class 'module'>
histogram2d <class 'module'>
histogram2dcontour <class 'module'>
icicle <class 'module'>
image <class 'module'>
indicator <class 'module'>
isosurface <class 'module'>
layout <class 'module'>
mesh3d <class 'module'>
ohlc <class 'module'>
parcats <class 'module'>
parcoords <class 'module'>
pie <class 'module'>
pointcloud <class 'module'>
sankey <class 'module'>
scatter <class 'module'>
scatter3d <class 'module'>
scattercarpet <class 'module'>
scattergeo <class 'module'>
scattergl <class 'module'>
scattermapbox <class 'module'>
scatterpolar <class 'module'>
scatterpolargl <class 'module'>
scattersmith <class 'module'>
scatterternary <class 'module'>
splom <class 'module'>
streamtube <class 'module'>
sunburst <class 'module'>
surface <class 'module'>
table <class 'module'>
treemap <class 'module'>
violin <class 'module'>
volume <class 'module'>
waterfall <class 'module'>

而 offline 模組則提供離線繪圖渲染函式, 主要是透過呼叫 plotly.offline.plot() 函式去繪圖 : 

>>> members.list_members(plotly.offline)     
download_plotlyjs <class 'function'>
enable_mpl_offline <class 'function'>
get_plotlyjs <class 'function'>
get_plotlyjs_version <class 'function'>
init_notebook_mode <class 'function'>
iplot <class 'function'>
iplot_mpl <class 'function'>
offline <class 'module'>
plot <class 'function'>
plot_mpl <class 'function'>

除了使用 offline 模組的 plot() 之外, 也可以用 graph_objs 模組中的 Figure 類別來繪圖. 

Plotly 自帶了 11 個測試用的小型資料集, 都放在 data 模組中, 內容如下 : 

>>> members.list_members(plotly.data)     
carshare <class 'function'>
election <class 'function'>
election_geojson <class 'function'>
experiment <class 'function'>
gapminder <class 'function'>
iris <class 'function'>
medals_long <class 'function'>
medals_wide <class 'function'>
stocks <class 'function'>
tips <class 'function'>
wind <class 'function'>

呼叫這些函式會傳回 DataFrame 型態的資料集, 例如著名的 iris 資料集 : 

>>> df=plotly.data.iris()    
>>> df     
     sepal_length  sepal_width  petal_length  petal_width    species  species_id
0             5.1          3.5           1.4          0.2     setosa           1
1             4.9          3.0           1.4          0.2     setosa           1
2             4.7          3.2           1.3          0.2     setosa           1
3             4.6          3.1           1.5          0.2     setosa           1
4             5.0          3.6           1.4          0.2     setosa           1
..            ...          ...           ...          ...        ...         ...
145           6.7          3.0           5.2          2.3  virginica           3
146           6.3          2.5           5.0          1.9  virginica           3
147           6.5          3.0           5.2          2.0  virginica           3
148           6.2          3.4           5.4          2.3  virginica           3
149           5.9          3.0           5.1          1.8  virginica           3

而 stocks 資料集則是收集 2018~2019 年美股 6 家公司的周收盤價 : 

>>> df=plotly.data.stocks()    
>>> df   
           date      GOOG      AAPL      AMZN        FB      NFLX      MSFT
0    2018-01-01  1.000000  1.000000  1.000000  1.000000  1.000000  1.000000
1    2018-01-08  1.018172  1.011943  1.061881  0.959968  1.053526  1.015988
2    2018-01-15  1.032008  1.019771  1.053240  0.970243  1.049860  1.020524
3    2018-01-22  1.066783  0.980057  1.140676  1.016858  1.307681  1.066561
4    2018-01-29  1.008773  0.917143  1.163374  1.018357  1.273537  1.040708
..          ...       ...       ...       ...       ...       ...       ...
100  2019-12-02  1.216280  1.546914  1.425061  1.075997  1.463641  1.720717
101  2019-12-09  1.222821  1.572286  1.432660  1.038855  1.421496  1.752239
102  2019-12-16  1.224418  1.596800  1.453455  1.104094  1.604362  1.784896
103  2019-12-23  1.226504  1.656000  1.521226  1.113728  1.567170  1.802472
104  2019-12-30  1.213014  1.678000  1.503360  1.098475  1.540883  1.788185


3. Plotly 繪圖的兩種方法 : 

使用 Plotly 繪圖基本上有下列三種方式 : 


(1). 使用 plotly.offline 模組的 plot() 函式 : 

使用 Plotly 繪圖的第一種方式是使用 plotly.offline 模組的 plot(), 但要先從 plotly.graph_objs 模組中匯入要繪製的圖形函式, 例如散布圖為 Scatter(), 然後傳入 x, y 軸資料建立 Scatter 物件, 再將此物件傳入 plotly.offline.plot() 的 data 參數即可, 例如繪製體重與身高關係的散布圖 : 

>>> import plotly   
>>> import plotly.graph_objs as go   
>>> weight=[49, 65, 53, 45, 56, 47, 52, 61]                   # 體重
>>> height=[159, 177, 156, 163, 164, 158, 166, 171]    # 身高    
>>> data=go.Scatter(x=weight, y=height, mode='markers')   # 建立 Scatter 圖形物件   
>>> type(data)    
<class 'plotly.graph_objs._scatter.Scatter'>      
>>> plotly.offline.plot({"data": [data]})     # 繪製圖形
'temp-plot.html'

此處 x, y 軸資料都是表示體重與身高之串列, mode 參數設為 'markers' 表示散布圖只顯示數據點標誌, 不顯示連接各資料點之直線, 所建立之 Scatter 物件須放在串列中傳給 plotly.offline.plot() 參數字典的 data 屬性. 

呼叫 plotly.offline.plot() 後會在目前工作目錄下建立一個暫時網頁檔來顯示此圖形, 並傳回此戰時網頁檔名稱, 然後開啟預設瀏覽器來呈現此網頁, 結果如下 : 




當滑鼠移到資料點上面時, 就會跳出訊息框顯示 (x, y) 坐標軸數據, 這就是 Plotly 的互動式效果. 用記事本開啟所建立的暫時網頁檔, 可知它其實就是透過 Javascript 程式碼來繪圖與產生互動效果的 : 




完整程式碼參考 :

測試 1-1 : 使用 plotly.offline 繪製散布圖  [看原始碼]

import plotly
import plotly.graph_objs as go
weight=[49, 65, 53, 45, 56, 47, 52, 61] # 體重
height=[159, 177, 156, 163, 164, 158, 166, 171] # 身高
data=go.Scatter(x=weight, y=height, mode='markers') # 建立 Scatter 圖形物件
plotly.offline.plot({"data": [data]}) # 繪製圖形


如果要在圖形上添加標題, 則需要用到 Layout 物件, 其類別同樣是放在 plotly.graph_objs 模組下, 只要呼叫其建構函式 Layout() 並傳入標題字串給 title 參數即可建立 Layout 物件, 然後於呼叫plotly.offline.plot() 時將此 Layout 物件傳給參數字典的 layout 屬性即可, 例如 : 


>>> import plotly   
>>> import plotly.graph_objs as go   
>>> weight=[49, 65, 53, 45, 56, 47, 52, 61]                   # 體重
>>> height=[159, 177, 156, 163, 164, 158, 166, 171]    # 身高    
>>> data=go.Scatter(x=weight, y=height, mode='markers')   # 建立 Scatter 圖形物件
>>> layout=go.Layout(title='The Relation of Weight and Height')      # 建立 Layout 物件 
>>> type(layout)       
<class 'plotly.graph_objs._layout.Layout'>
>>> plotly.offline.plot({"data": [data], "layout": layout})         
'temp-plot.html'

結果如下 :




可見標題預設為靠左對齊. 

完整程式碼參考 :

測試 1-2 : 使用 plotly.offline 繪製散布圖 (添加標題)  [看原始碼]

import plotly   
import plotly.graph_objs as go   
weight=[49, 65, 53, 45, 56, 47, 52, 61]  # 體重
height=[159, 177, 156, 163, 164, 158, 166, 171] # 身高    
data=go.Scatter(x=weight, y=height, mode='markers') # 建立 Scatter 圖形物件
layout=go.Layout(title='The Relation of Weight and Height') # 建立 Layout 物件 
plotly.offline.plot({"data": [data], "layout": layout}) 


(2). 使用 plotly.graph_objs 模組的 Figure 類別 : 

Plotly 的 graph_objs 模組下的 Figure 類別也可以用來繪圖, 把圖形物件傳給其建構函式 Figure() 即可建立一個 Figure 物件, 然後呼叫其 show() 方法顯示圖形, 結果與上面使用 plotly.offline.plot() 一樣, 也會建立一個暫時網頁檔來顯示互動式圖形 : 

>>> import plotly   
>>> import plotly.graph_objs as go   
>>> weight=[49, 65, 53, 45, 56, 47, 52, 61]                   # 體重
>>> height=[159, 177, 156, 163, 164, 158, 166, 171]    # 身高    
>>> scatter=go.Scatter(x=weight, y=height, mode='markers')   # 建立 Scatter 圖形物件
>>> fig=go.Figure(scatter)       # 依據所傳入之圖形物件建立 Figure 物件
>>> type(fig)      
<class 'plotly.graph_objs._figure.Figure'>      
>>> fig.show()       # 顯示圖形 

完整程式碼參考 :

測試 1-2 : 使用 plotly.graph_objs.Figure 繪製散布圖 [看原始碼]

import plotly   
import plotly.graph_objs as go   
weight=[49, 65, 53, 45, 56, 47, 52, 61] # 體重
height=[159, 177, 156, 163, 164, 158, 166, 171] # 身高    
scatter=go.Scatter(x=weight, y=height, mode='markers') # 建立 Scatter 圖形物件
fig=go.Figure(scatter) # 依據所傳入之圖形物件建立 Figure 物件
fig.show() # 顯示圖形 

用 members 模組檢視 Figure 物件成員如下 : 

>>> members.list_members(fig)    
add_annotation <class 'method'>
add_bar <class 'method'>
add_barpolar <class 'method'>
add_box <class 'method'>
add_candlestick <class 'method'>
add_carpet <class 'method'>
add_choropleth <class 'method'>
add_choroplethmapbox <class 'method'>
add_cone <class 'method'>
add_contour <class 'method'>
add_contourcarpet <class 'method'>
add_densitymapbox <class 'method'>
add_funnel <class 'method'>
add_funnelarea <class 'method'>
add_heatmap <class 'method'>
add_heatmapgl <class 'method'>
add_histogram <class 'method'>
add_histogram2d <class 'method'>
add_histogram2dcontour <class 'method'>
add_hline <class 'method'>
add_hrect <class 'method'>
add_icicle <class 'method'>
add_image <class 'method'>
add_indicator <class 'method'>
add_isosurface <class 'method'>
add_layout_image <class 'method'>
add_mesh3d <class 'method'>
add_ohlc <class 'method'>
add_parcats <class 'method'>
add_parcoords <class 'method'>
add_pie <class 'method'>
add_pointcloud <class 'method'>
add_sankey <class 'method'>
add_scatter <class 'method'>
add_scatter3d <class 'method'>
add_scattercarpet <class 'method'>
add_scattergeo <class 'method'>
add_scattergl <class 'method'>
add_scattermapbox <class 'method'>
add_scatterpolar <class 'method'>
add_scatterpolargl <class 'method'>
add_scattersmith <class 'method'>
add_scatterternary <class 'method'>
add_selection <class 'method'>
add_shape <class 'method'>
add_splom <class 'method'>
add_streamtube <class 'method'>
add_sunburst <class 'method'>
add_surface <class 'method'>
add_table <class 'method'>
add_trace <class 'method'>
add_traces <class 'method'>
add_treemap <class 'method'>
add_violin <class 'method'>
add_vline <class 'method'>
add_volume <class 'method'>
add_vrect <class 'method'>
add_waterfall <class 'method'>
append_trace <class 'method'>
batch_animate <class 'method'>
batch_update <class 'method'>
data <class 'tuple'>
for_each_annotation <class 'method'>
for_each_coloraxis <class 'method'>
for_each_geo <class 'method'>
for_each_layout_image <class 'method'>
for_each_mapbox <class 'method'>
for_each_polar <class 'method'>
for_each_scene <class 'method'>
for_each_selection <class 'method'>
for_each_shape <class 'method'>
for_each_smith <class 'method'>
for_each_ternary <class 'method'>
for_each_trace <class 'method'>
for_each_xaxis <class 'method'>
for_each_yaxis <class 'method'>
frames <class 'tuple'>
full_figure_for_development <class 'method'>
get_subplot <class 'method'>
layout <class 'plotly.graph_objs._layout.Layout'>
plotly_relayout <class 'method'>
plotly_restyle <class 'method'>
plotly_update <class 'method'>
pop <class 'method'>
print_grid <class 'method'>
select_annotations <class 'method'>
select_coloraxes <class 'method'>
select_geos <class 'method'>
select_layout_images <class 'method'>
select_mapboxes <class 'method'>
select_polars <class 'method'>
select_scenes <class 'method'>
select_selections <class 'method'>
select_shapes <class 'method'>
select_smiths <class 'method'>
select_ternaries <class 'method'>
select_traces <class 'method'>
select_xaxes <class 'method'>
select_yaxes <class 'method'>
set_subplots <class 'method'>
show <class 'method'>
to_dict <class 'method'>
to_html <class 'method'>
to_image <class 'method'>
to_json <class 'method'>
to_ordered_dict <class 'method'>
to_plotly_json <class 'method'>
update <class 'method'>
update_annotations <class 'method'>
update_coloraxes <class 'method'>
update_geos <class 'method'>
update_layout <class 'method'>
update_layout_images <class 'method'>
update_mapboxes <class 'method'>
update_polars <class 'method'>
update_scenes <class 'method'>
update_selections <class 'method'>
update_shapes <class 'method'>
update_smiths <class 'method'>
update_ternaries <class 'method'>
update_traces <class 'method'>
update_xaxes <class 'method'>
update_yaxes <class 'method'>
write_html <class 'method'>
write_image <class 'method'>
write_json <class 'method'>

可見 Figure 物件圖供了非常豐富的繪圖相關方法, 例如要為圖形添加標題可以用 update_layout() 方法, 並傳入一個 title 參數字典, 屬性如下 :
  • text : 設定標題文字
  • xanchor : 用來指定標題的 x 軸的對齊方式, 可用 'left', 'center', 'right' 或 'auto'
  • x : 標題的 x 軸位置 (0~1)
  • y :  標題的 y 軸位置 (0~1)
例如 : 

>>> import plotly   
>>> import plotly.graph_objs as go   
>>> weight=[49, 65, 53, 45, 56, 47, 52, 61]                   # 體重
>>> height=[159, 177, 156, 163, 164, 158, 166, 171]    # 身高    
>>> scatter=go.Scatter(x=weight, y=height, mode='markers')   # 建立 Scatter 圖形物件
>>> fig=go.Figure(scatter)       # 依據所傳入之圖形物件建立 Figure 物件
>>> title={'text': 'The Relation of Weight and Height', 'x': 0.5, 'y':0.9, 'xanchor': 'center'}    
>>> fig.update_layout(title=title)    
Figure({
    'data': [{'mode': 'markers',
              'type': 'scatter',
              'x': [49, 65, 53, 45, 56, 47, 52, 61],
              'y': [159, 177, 156, 163, 164, 158, 166, 171]}],
    'layout': {'template': '...',
               'title': {'text': 'The Relation of Weight and Height', 'x': 0.5, 'xanchor': 'center', 'y': 0.9}}
})
>>> fig.show()    

結果如下 : 




(3). 使用 plotly.express 模組 : 

以上兩種繪圖方法都是使用 Plotly 原生的繪圖函式, 需要設定的參數較多, 更方便的用法是透過 Plotly Express, 它原本是 Plotly 二次包裝的獨立套件, 以前需要用 pip install 安裝, 但在 Plotly 第 4 版後已被納入 Plotly 內, 只要安裝 Plotly 即可使用, 由於它的繪圖介面簡單易用, 可以快速繪製出各種圖形, 所以也是最被推薦的 Plotly 用法, 參考 : 


用 type() 檢查 plotly.express 為模組, 但用 dir(plotly) 檢視卻看不到此模組, 奇怪 : 

>>> import plotly 
>>> type(plotly.express)    
<class 'module'>
>>> dir(plotly)    
['__version__', 'colors', 'data', 'graph_objects', 'graph_objs', 'io', 'offline', 'tools', 'utils']

Plotly Express 模組其實是利用 plotly.graph_objs 或 plotly_graph_objects 模組的原生繪圖函式進行二次包裝, 提供了超過 30 種更簡易呼叫的繪圖函式, 參考 :


這些函式都會回傳一個 Figure 物件, 呼叫其 show() 方法即可建立一個網頁來呈現圖形. 先用自訂的 members 模組檢視 Figure 物件成員 : 

>>> members.list_members(plotly.express)   
Constant <class 'type'>
IdentityMap <class 'type'>
NO_COLOR <class 'str'>
Range <class 'type'>
absolute_import <class '__future__._Feature'>
area <class 'function'>
bar <class 'function'>
bar_polar <class 'function'>
box <class 'function'>
choropleth <class 'function'>
choropleth_mapbox <class 'function'>
colors <class 'module'>
data <class 'module'>
defaults <class 'plotly.express._core.PxDefaults'>
density_contour <class 'function'>
density_heatmap <class 'function'>
density_mapbox <class 'function'>
ecdf <class 'function'>
funnel <class 'function'>
funnel_area <class 'function'>
get_trendline_results <class 'function'>
histogram <class 'function'>
icicle <class 'function'>
imshow <class 'function'>
imshow_utils <class 'module'>
line <class 'function'>
line_3d <class 'function'>
line_geo <class 'function'>
line_mapbox <class 'function'>
line_polar <class 'function'>
line_ternary <class 'function'>
optional_imports <class 'module'>
parallel_categories <class 'function'>
parallel_coordinates <class 'function'>
pd <class 'module'>
pie <class 'function'>
scatter <class 'function'>
scatter_3d <class 'function'>
scatter_geo <class 'function'>
scatter_mapbox <class 'function'>
scatter_matrix <class 'function'>
scatter_polar <class 'function'>
scatter_ternary <class 'function'>
set_mapbox_access_token <class 'function'>
strip <class 'function'>
sunburst <class 'function'>
timeline <class 'function'>
treemap <class 'function'>
trendline_functions <class 'module'>
violin <class 'function'>

其中 data 模組是內建的小型資料集, 它其實就是串接到 Plotly 本身的 data 模組, 內容雷容 :

>>> members.list_members(plotly.express.data)    
absolute_import <class '__future__._Feature'>
carshare <class 'function'>
election <class 'function'>
election_geojson <class 'function'>
experiment <class 'function'>
gapminder <class 'function'>
iris <class 'function'>
medals_long <class 'function'>
medals_wide <class 'function'>
stocks <class 'function'>
tips <class 'function'>
wind <class 'function'>

使用 Plotly Express 繪圖需先匯入 plotly.express 模組, 通常取別名為 px : 

import plotly.express as px

以上面所繪製的體重與身高關係散布圖為例, 只要呼叫 px.scatter() 時傳入字典或 DataFrame 資料, 並指定欄位名稱給 x, y 參數即可建立 Figure 圖形物件, 最後呼叫其 show() 方法就會建立一個網頁來顯示圖形, 例如 : 

>>> import plotly.express as px    
>>> weight=[49, 65, 53, 45, 56, 47, 52, 61]                   # 體重
>>> height=[159, 177, 156, 163, 164, 158, 166, 171]    # 身高    
>>> data={'weight': weight, 'height': height}              # 將資料打包成字典
>>> fig=px.scatter(data, x='weight', y='height')         # 指定 x, y 軸欄位繪圖
>>> fig.show()      

結果與上面是一樣的 : 




完整程式碼參考 : 

測試 3-1 : 使用 plotly.express 繪製散布圖 (Dict)  [看原始碼]

import plotly.express as px    
weight=[49, 65, 53, 45, 56, 47, 52, 61] # 體重
height=[159, 177, 156, 163, 164, 158, 166, 171] # 身高    
data={'weight': weight, 'height': height}    
fig=px.scatter(data, x='weight', y='height') 
fig.show()

也可以傳入 DataFrame, 例如 : 

>>> import pandas as pd    
>>> fig=px.scatter(pd.DataFrame(data), x='weight', y='height')    
>>> fig.show()   

完整程式碼參考 : 

測試 3-2 : 使用 plotly.express 繪製散布圖 (DataFrame)  [看原始碼]

import pandas as pd
import plotly.express as px    
weight=[49, 65, 53, 45, 56, 47, 52, 61] # 體重
height=[159, 177, 156, 163, 164, 158, 166, 171] # 身高    
data=pd.DataFrame({'weight': weight, 'height': height})    
fig=px.scatter(data, x='weight', y='height') 
fig.show()

可見如同其名, Plotly Express 確實能快速繪製所需圖形. 


參考 :


沒有留言 :