8 個流行的 Python 可視化工具包,你喜歡哪個?

2021-03-02 傑哥的IT之旅

公眾號關注「傑哥的IT之旅」,

來源:機器之心  作者:Aaron Frederick

參與:李詩萌、王淑婷

喜歡用 Python 做項目的小夥伴不免會遇到這種情況:做圖表時,用哪種好看又實用的可視化工具包呢?之前文章裡出現過漂亮的圖表時,也總有讀者在後臺留言問該圖表時用什麼工具做的。下面,作者介紹了八種在 Python 中實現的可視化工具包,其中有些包還能用在其它語言中。快來試試你喜歡哪個?

用 Python 創建圖形的方法有很多,但是哪種方法是最好的呢?當我們做可視化之前,要先明確一些關於圖像目標的問題:你是想初步了解數據的分布情況?想展示時給人們留下深刻印象?也許你想給某人展示一個內在的形象,一個中庸的形象?

本文將介紹一些常用的 Python 可視化包,包括這些包的優缺點以及分別適用於什麼樣的場景。這篇文章只擴展到 2D 圖,為下一次講 3D 圖和商業報表(dashboard)留了一些空間,不過這次要講的包中,許多都可以很好地支持 3D 圖和商業報表。

Matplotlib、Seaborn 和 Pandas

把這三個包放在一起有幾個原因:首先 Seaborn 和 Pandas 是建立在 Matplotlib 之上的,當你在用 Seaborn 或 Pandas 中的 df.plot() 時,用的其實是別人用 Matplotlib 寫的代碼。因此,這些圖在美化方面是相似的,自定義圖時用的語法也都非常相似。

當提到這些可視化工具時,我想到三個詞:探索(Exploratory)、數據(Data)、分析(Analysis)。這些包都很適合第一次探索數據,但要做演示時用這些包就不夠了。

Matplotlib 是比較低級的庫,但它所支持的自定義程度令人難以置信(所以不要簡單地將其排除在演示所用的包之外!),但還有其它更適合做展示的工具。

Matplotlib 還可以選擇樣式(style selection),它模擬了像 ggplot2 和 xkcd 等很流行的美化工具。下面是我用 Matplotlib 及相關工具所做的示例圖:

在處理籃球隊薪資數據時,我想找出薪資中位數最高的團隊。為了展示結果,我將每個球隊的工資用顏色標成條形圖,來說明球員加入哪一支球隊才能獲得更好的待遇。

import seaborn as sns
import matplotlib.pyplot as plt

color_order = ['xkcd:cerulean', 'xkcd:ocean',
                'xkcd:black','xkcd:royal purple',
                'xkcd:royal purple', 'xkcd:navy blue',
                'xkcd:powder blue', 'xkcd:light maroon', 
                'xkcd:lightish blue','xkcd:navy']

sns.barplot(x=top10.Team,
            y=top10.Salary,
            palette=color_order).set_title('Teams with Highest Median Salary')

plt.ticklabel_format(style='sci', axis='y', scilimits=(0,0))

第二個圖是回歸實驗殘差的 Q-Q 圖。這張圖的主要目的是展示如何用儘量少的線條做出一張有用的圖,當然也許它可能不那麼美觀。

import matplotlib.pyplot as plt
import scipy.stats as stats

#model2 is a regression model
log_resid = model2.predict(X_test)-y_test
stats.probplot(log_resid, dist="norm", plot=plt)
plt.title("Normal Q-Q plot")
plt.show()

最終證明,Matplotlib 及其相關工具的效率很高,但就演示而言它們並不是最好的工具。

ggplot(2)

你可能會問,「Aaron,ggplot 是 R 中最常用的可視化包,但你不是要寫 Python 的包嗎?」。人們已經在 Python 中實現了 ggplot2,複製了這個包從美化到語法的一切內容。

在我看過的所有材料中,它的一切都和 ggplot2 很像,但這個包的好處是它依賴於 Pandas Python 包。不過 Pandas Python 包最近棄用了一些方法,導致 Python 版本不兼容。

如果你想在 R 中用真正的 ggplot(除了依賴關係外,它們的外觀、感覺以及語法都是一樣的),我在另外一篇文章中對此進行過討論。

也就是說,如果你一定要在 Python 中用 ggplot,那你就必須要安裝 0.19.2 版的 Pandas,但我建議你最好不要為了使用較低級的繪圖包而降低 Pandas 的版本。

ggplot2(我覺得也包括 Python 的 ggplot)舉足輕重的原因是它們用「圖形語法」來構建圖片。基本前提是你可以實例化圖,然後分別添加不同的特徵;也就是說,你可以分別對標題、坐標軸、數據點以及趨勢線等進行美化。

下面是 ggplot 代碼的簡單示例。我們先用 ggplot 實例化圖,設置美化屬性和數據,然後添加點、主題以及坐標軸和標題標籤。

#All Salaries
ggplot(data=df, aes(x=season_start, y=salary, colour=team)) +
  geom_point() +
  theme(legend.position="none") +
  labs(title = 'Salary Over Time', x='Year', y='Salary ($)')

Bokeh

Bokeh 很美。從概念上講,Bokeh 類似於 ggplot,它們都是用圖形語法來構建圖片,但 Bokeh 具備可以做出專業圖形和商業報表且便於使用的界面。為了說明這一點,我根據 538 Masculinity Survey 數據集寫了製作直方圖的代碼:

import pandas as pd
from bokeh.plotting import figure
from bokeh.io import show

# is_masc is a one-hot encoded dataframe of responses to the question:
# "Do you identify as masculine?"

#Dataframe Prep
counts = is_masc.sum()
resps = is_masc.columns

#Bokeh
p2 = figure(title='Do You View Yourself As Masculine?',
          x_axis_label='Response',
          y_axis_label='Count',
          x_range=list(resps))
p2.vbar(x=resps, top=counts, width=0.6, fill_color='red', line_color='black')
show(p2)

#Pandas
counts.plot(kind='bar')

用 Bokeh 表示調查結果

紅色的條形圖表示 538 個人關於「你認為自己有男子漢氣概嗎?」這一問題的答案。9~14 行的 Bokeh 代碼構建了優雅且專業的響應計數直方圖——字體大小、y 軸刻度和格式等都很合理。

我寫的代碼大部分都用於標記坐標軸和標題,以及為條形圖添加顏色和邊框。在製作美觀且表現力強的圖片時,我更傾向於使用 Bokeh——它已經幫我們完成了大量美化工作。

用 Pandas 表示相同的數據

藍色的圖是上面的第 17 行代碼。這兩個直方圖的值是一樣的,但目的不同。在探索性設置中,用 Pandas 寫一行代碼查看數據很方便,但 Bokeh 的美化功能非常強大。

Bokeh 提供的所有便利都要在 matplotlib 中自定義,包括 x 軸標籤的角度、背景線、y 軸刻度以及字體(大小、斜體、粗體)等。下圖展示了一些隨機趨勢,其自定義程度更高:使用了圖例和不同的顏色和線條。

Bokeh 還是製作交互式商業報表的絕佳工具。

Plotly

Plotly 非常強大,但用它設置和創建圖形都要花費大量時間,而且都不直觀。在用 Plotly 忙活了大半個上午後,我幾乎什麼都沒做出來,乾脆直接去吃飯了。我只創建了不帶坐標標籤的條形圖,以及無法刪掉線條的「散點圖」。Ploty 入門時有一些要注意的點:

但它也有優點,而且設置中的所有缺點都有相應的解決方法:

以下是我針對這個包編寫的代碼:

#plot 1 - barplot
# **note** - the layout lines do nothing and trip no errors
data = [go.Bar(x=team_ave_df.team,
              y=team_ave_df.turnovers_per_mp)]

layout = go.Layout(

    title=go.layout.Title(
        text='Turnovers per Minute by Team',
        xref='paper',
        x=0
    ),

    xaxis=go.layout.XAxis(
        title = go.layout.xaxis.Title(
            text='Team',
            font=dict(
                    family='Courier New, monospace',
                    size=18,
                    color='#7f7f7f'
                )
        )
    ),

    yaxis=go.layout.YAxis(
        title = go.layout.yaxis.Title(
            text='Average Turnovers/Minute',
            font=dict(
                    family='Courier New, monospace',
                    size=18,
                    color='#7f7f7f'
                )
        )
    ),

    autosize=True,
    hovermode='closest')

py.iplot(figure_or_data=data, layout=layout, filename='jupyter-plot', sharing='public', fileopt='overwrite')



#plot 2 - attempt at a scatterplot
data = [go.Scatter(x=player_year.minutes_played,
                  y=player_year.salary,
                  marker=go.scatter.Marker(color='red',
                                          size=3))]

layout = go.Layout(title="test",
                xaxis=dict(title='why'),
                yaxis=dict(title='plotly'))

py.iplot(figure_or_data=data, layout=layout, filename='jupyter-plot2', sharing='public')

[Image: image.png]

表示不同 NBA 球隊每分鐘平均失誤數的條形圖。

表示薪水和在 NBA 的打球時間之間關係的散點圖

總體來說,開箱即用的美化工具看起來很好,但我多次嘗試逐字複製文檔和修改坐標軸標籤時卻失敗了。但下面的圖展示了 Plotly 的潛力,以及我為什麼要在它身上花好幾個小時:

Plotly 頁面上的一些示例圖

Pygal

Pygal 的名氣就不那麼大了,和其它常用的繪圖包一樣,它也是用圖形框架語法來構建圖像的。由於繪圖目標比較簡單,因此這是一個相對簡單的繪圖包。使用 Pygal 非常簡單:

我在使用 Pygal 的過程中遇到的主要問題在於圖片渲染。必須要用 render_to_file 選項,然後在 web 瀏覽器中打開文件,才能看見我剛剛構建的東西。

最終看來這是值得的,因為圖片是交互式的,有令人滿意而且便於自定義的美化功能。總而言之,這個包看起來不錯,但在文件的創建和渲染部分比較麻煩。

Networkx

雖然 Networkx 是基於 matplotlib 的,但它仍是圖形分析和可視化的絕佳解決方案。圖形和網絡不是我的專業領域,但 Networkx 可以快速簡便地用圖形表示網絡之間的連接。以下是我針對一個簡單圖形構建的不同的表示,以及一些從斯坦福 SNAP 下載的代碼(關於繪製小型 Facebook 網絡)。

我按編號(1~10)用顏色編碼了每個節點,代碼如下:

options = {
    'node_color' : range(len(G)),
    'node_size' : 300,
    'width' : 1,
    'with_labels' : False,
    'cmap' : plt.cm.coolwarm
}
nx.draw(G, **options)

用於可視化上面提到的稀疏 Facebook 圖形的代碼如下:

import itertools
import networkx as nx
import matplotlib.pyplot as plt

f = open('data/facebook/1684.circles', 'r')
circles = [line.split() for line in f]
f.close()

network = []
for circ in circles:
    cleaned = [int(val) for val in circ[1:]]
    network.append(cleaned)

G = nx.Graph()
for v in network:
    G.add_nodes_from(v)

edges = [itertools.combinations(net,2) for net in network]

for edge_group in edges:
    G.add_edges_from(edge_group)

options = {
    'node_color' : 'lime',
    'node_size' : 3,
    'width' : 1,
    'with_labels' : False,
}
nx.draw(G, **options)

這個圖形非常稀疏,Networkx 通過最大化每個集群的間隔展現了這種稀疏化。

有很多數據可視化的包,但沒法說哪個是最好的。希望閱讀本文後,你可以了解到在不同的情境下,該如何使用不同的美化工具和代碼。

原文連結:https://towardsdatascience.com/reviewing-python-visualization-packages-fa7fe12e622b

相關焦點

  • 這裡有8個流行的Python可視化工具包,你喜歡哪個?
    :做圖表時,用哪種好看又實用的可視化工具包呢?之前文章裡出現過漂亮的圖表時,也總有讀者在後臺留言問該圖表時用什麼工具做的。下面,作者介紹了八種在 Python 中實現的可視化工具包,其中有些包還能用在其它語言中。快來試試你喜歡哪個?用 Python 創建圖形的方法有很多,但是哪種方法是最好的呢?當我們做可視化之前,要先明確一些關於圖像目標的問題:你是想初步了解數據的分布情況?想展示時給人們留下深刻印象?
  • 8個流行的Python可視化工具
    Python 做項目的小夥伴不免會遇到這種情況:做圖表時,用哪種好看又實用的可視化工具包呢?之前文章裡出現過漂亮的圖表時,也總有讀者在後臺留言問該圖表時用什麼工具做的。下面,作者介紹了八種在 Python 中實現的可視化工具包,其中有些包還能用在其它語言中。快來試試你喜歡哪個?用 Python 創建圖形的方法有很多,但是哪種方法是最好的呢?當我們做可視化之前,要先明確一些關於圖像目標的問題:你是想初步了解數據的分布情況?想展示時給人們留下深刻印象?
  • 讓所有程式設計師絕不能錯過的59個Python庫總結!
    Python有以下三個特點:易用性和靈活性全行業高接受度:Python無疑是業界最流行的數據科學語言用於數據科學的Python庫的豐富數量優勢本文介紹了python人最常用的59個python庫。一起來看看吧~用於數據收集的Python庫1.
  • MindSpore可視化工具使用指南
    5 月12 日,機器之心聯合華為昇騰學院開設的線上公開課《輕鬆上手開源框架MindSpore》第 6 課完成,王越講師為大家帶來了主題分享《MindSpore可視化工具使用指南
  • python爬蟲—豆瓣電影top250及數據可視化!
    本次教程就是利用requests庫實現對於top250榜單電影數據爬取,並對爬取的數據繪製圖表進行可視化,做簡單的數據分析。文章將分為兩個部分:top250數據爬蟲和數據可視化。top250數據爬取首先,打開豆瓣電影top250的網頁,利用開發者工具對頁面的數據進行簡單的分析,用開發者選擇項來選取要提取的數據(電影名字、上映時間、上映地區、評分、電影主題標語等等)其次,要爬取全部數據,需要實現翻頁功能;這裡提供兩種思路:第一種是每個頁面的url是類似的,都有相似的構造結構,因此這裡可以利用
  • 如何在Visual Studio開發工具安裝python庫
    那麼,在Visual Studio開發工具中,如何安裝python第三方庫呢?下面利用實例說明:操作步驟:1、打開Visual Studio 2019開發工具,創建python項目工具菜單,選擇python,python環境4、打開python環境,選擇python3.8,創建交互式窗口
  • Python常用庫大全
    Pygments – 通用語法高亮工具。 pyparsing – 生成通用解析器的框架。 python-nameparser – 把一個人名分解為幾個獨立的部分。 python-user-agents – 瀏覽器 user agent 解析器。 sqlparse – 一個無驗證的 SQL 解析器。 特殊文本格式處理一些用來解析和操作特殊文本格式的庫。
  • Perl還是Python或者R
    如果你精通python,我相信你一周之內肯定能精通perl語言。假如我們把文本處理比作語文,科學計算比喻成數學,數據可視化比喻成繪畫三門學科。生物大數據大多以文本模式存儲,而且同樣屬於非結構化數據,所以,perl自然被大量用在生物數據處理中,有很多生物軟體就是用perl語言寫的,例如rnamer,nucmer等,很多生物軟體安裝包中提供一些附加小工具也是用perl寫的。另外,Perl根植於Linux shell,可以與shell進行很好的配合,比shell編程要更強大,可以替代shell完成很多自動化和批量化的操作。
  • 30行Python代碼實現3D數據可視化
    connecting linesx, y = zip(*path.vertices)line, = ax.plot(x, y, 'go-')ax.grid()ax.axis('equal')plt.show()心型效果圖3D 帽子圖1Matplotlib 繪製 3D 圖形使用的是 mplot3d Toolkit,即 mplot3d 工具包
  • Python 炫技操作:安裝包的八種方法
    使用 pipxpipx 是一個專門用於安裝和管理 cli 應用程式的工具,使用它安裝的 Python 包會單獨安裝到一個全新的獨有虛擬環境。由於它是一個第三方工具,因此在使用它之前,需要先安裝$ python3 -m pip install  $ python3 -m userpath append ~/.
  • Python 打包的現狀:包的三種類型
    如果你想了解 Python 打包(packaging)生態的現狀及將來如何演變,請繼續閱讀。我們希望,即使上述提到的 Python 增強提案(譯註:即 PEP,關於 PEP 的介紹,請閱讀這篇文章),如今可能會引起一些不愉快,但從長遠來看,我們將從中受益。我大約在三年前加入了 Python 開源社區(儘管使用它已有 8 年之久)。從早期開始,我就聽說 Python 打包有一點黑匣子的名聲。
  • 數據可視化最有價值的50個圖表 | 網際網路數據資訊網-199IT | 中文...
    在數據分析和可視化中最有用的 50 個 Matplotlib 圖表。 這些圖表列表允許您使用 python 的 matplotlib 和 seaborn 庫選擇要顯示的可視化對象。這些圖表根據可視化目標的7個不同情景進行分組。 例如,如果要想像兩個變量之間的關係,請查看「關聯」部分下的圖表。 或者,如果您想要顯示值如何隨時間變化,請查看「變化」部分,依此類推。
  • Python 中最流行的十個標準庫
    Python 是當今人工智慧和機器學習領域最流行的程式語言之一。Python 以其有用的庫和包而著稱,即使沒有軟體工程背景的人也能編程。Python 擁有一組與 Python 語言一起分發的標準庫,如 DateTime、math 或 Random。
  • 如何使用Visual Studio工具創建python項目
    工具Visual Studio 2019python環境技術隨著工具不斷完善,現在也可以進行python項目開發了。那麼,如何在Visual Studio 2019工具上創建python項目?操作步驟:1、通過快捷方式或電腦開始菜單,雙擊打開Visual Studio 2019工具
  • 22個免費的數據可視化和分析工具推薦
    【IT168 評論】本文總結推薦22個免費的數據可視化和分析工具。列表如下:  數據清理(Data cleaning)  當你分析和可視化數據前,常需要「清理」工作。比如一些輸入性列表「New York City" ,同時其他人會說"New York, NY" 。
  • Python2 已終結,入手Python 3,你需要這30個技巧
    這篇教程有 30 個你會喜歡的方法。勤勞的程式設計師們,這裡有 30 條使用 Python 時實用的建議和小技巧。你可以把讀這篇文章當做工作間隙的小憩,而且我保證你學到的東西會跟工作時一樣多。如果你關注 Python 的話,應該會知道 Python 2 已經於今年(2020 年)1 月 1 日正式棄用了。
  • 50個令人大開眼界的 Matplotlib 可視化項目
    本文由和鯨創作者@lqy上傳,翻譯自machinelearningplus.com,來源連結:https://www.machinelearningplus.com/plots/top-50-matplotlib-visualizations-the-master-plots-python
  • 手把手教你用Python爬中國電影票房數據
    DataFrame:DataFrame可以簡單理解為Excel裡的表格格式。sdate=' for i in range(5)],'date' :pd.date_range(20190114,freq = 'W-MON',periods = 5)})'''將網址相同的部分生成5次,並利用pandas的時間序列功能生成5個星期一對應的日期。
  • 獨家 | LDA主題建模和pyLDAvis可視化
    pyLDAvis是一個交互式LDA可視化python軟體包。我的LDA建模結果是什麼樣的?我截取了一個pyLDAvis結果圖,如下圖所示。圓圈區域表示每個主題在整個語料庫中的重要性,圓圈中心之間的距離表示主題之間的相似性。對於每個主題,右側的直方圖列出了前30個最相關的字詞。LDA幫助我提取了6個主要主題。
  • 可視化腦洞十五個數據可視化的奇妙例子
    那必定意味著數據可視化比得上千言萬語,對不對?無論如何,是時候讓我們收羅一些最具視覺衝擊力的複雜數據集了。以下是我最喜歡的15個例子。p=36.950;99.141;3&l=temperature&t=20160714/09該可視化工具可以實時查看全球各個地區氣象情況。正如你所見,在英國,溫和的降水是個穩定的狀態。