unstack中文翻譯,unstack是什么意思,unstack發(fā)音、用法及例句
- 內容導航:
- 1、unstack
- 2、如何高效地使用Matplotlib?
1、unstack
unstack發(fā)音
英: 美:
unstack中文意思翻譯
常見(jiàn)釋義:
退棧,出棧
unstack相似詞語(yǔ)短語(yǔ)
1、couples counseling───夫妻咨詢(xún)
2、unscriptural prayers───無(wú)劇本的祈禱
3、buttering buns───奶油面包
4、pronouns worksheets───代詞工作表
5、unsafelywelcome go home───不安全歡迎回家
6、unsound lyrics───不健全的歌詞
7、dative pronouns───與格代詞
8、unskilled jobs that pay well───薪水高的非技術(shù)性工作
9、unsatisfying gif───不滿(mǎn)意的gif
10、gunshot wounds───火器傷;槍傷
2、如何高效地使用Matplotlib?
引言
對新手來(lái)說(shuō) Python 可視化實(shí)在有些令人挫敗。有很多不同的選項,如何選擇正確的選項是一個(gè)挑戰。例如,兩年前這篇文章《Overview of Python Visualization Tools》(http://pbpython.com/visualization-tools-1.html)仍然吸引了大量讀者。在那篇文章中,我否定了 Matplotlib。但是,在使用過(guò) pandas、scikit-learn、seaborn 和其他 Python 數據科學(xué)棧之后,我覺(jué)得之前否認 Matplotlib 的行為有點(diǎn)不成熟。坦白講,當時(shí)我不是很了解 Matplotlib,也不懂如何在我的工作流中高效使用 Matplotlib。
現在我學(xué)習了一些工具,了解了如何用 Matplotlib 使用這些工具,Matplotlib 逐漸變成了必需工具。本文將展示如何使用 Matplotlib。我堅定地認為 Matplotlib 是 Python 數據科學(xué)棧必不可少的一部分,希望這篇文章可以幫助大家了解如何使用 Matplotlib 進(jìn)行 Python 可視化。
為什么大家都在否定 Matplotlib?
我認為,Matplotlib 對于新手來(lái)說(shuō)比較難存在幾個(gè)原因。首先,Matplotlib 有兩個(gè)界面。第一個(gè)界面基于 MATLAB,使用基于狀態(tài)的接口。第二個(gè)界面是面向對象的接口。本文就不展開(kāi)介紹 Matplotlib 有兩個(gè)界面的原因,但了解這兩種方法在使用 Matplotlib 繪圖時(shí)會(huì )很重要。兩個(gè)界面會(huì )引起混淆的原因是堆棧溢出和通過(guò)谷歌搜索獲取的大量信息,新用戶(hù)將發(fā)現問(wèn)題的多個(gè)解決方案,但是這些問(wèn)題看起來(lái)類(lèi)似卻不完全相同。從我的個(gè)人經(jīng)驗來(lái)講,從以前的代碼中,我可以看出有一些 Matplotlib 代碼的混雜,我對此感覺(jué)很疑惑(盡管寫(xiě)它們的人是我……):-)
關(guān)鍵點(diǎn)
Matplotlib 新手應該學(xué)習和使用面向對象的接口。
使用 Matplotlib 的另一個(gè)歷史性挑戰是一些默認的樣式缺乏吸引力。在 R 使用 ggplot 就可以生成相當不錯的圖的世界中,Matplotlib 相對來(lái)說(shuō)有點(diǎn)丑。好消息是 Matplotlib 2.0 中的樣式好看了很多,你可以用最小的努力生成可視化。
第三個(gè)挑戰是你不確定什么時(shí)候該使用 Matplotlib,什么時(shí)候該使用基于 Matplotlib 構建的工具,如 pandas 或 seaborn。大部分時(shí)候做一件事都有多種選擇,但是對于新手來(lái)說(shuō)選擇正確的道路有些困難。這種混淆加上兩種不同 API 的混淆簡(jiǎn)直就是挫敗本敗了……
為什么使用 Matplotlib?
盡管 Matplotlib 有這么多問(wèn)題,我還是喜歡用它,因為它很強大。這個(gè)庫允許你創(chuàng )建幾乎所有可視化。此外,圍繞 Matplotlib 有一個(gè)豐富的 Python 工具生態(tài)環(huán)境,很多更高級的可視化工具使用 Matplotlib 作為基礎庫。如果你想在 Python 數據科學(xué)棧中進(jìn)行任何操作,你需要對如何使用 Matplotlib 有一些基礎了解。這就是本文其余部分的重點(diǎn)——提供一種高效使用 Matplotlib 的基礎方法。
前提
推薦以下步驟學(xué)習如何使用 Matplotlib:
1. 學(xué)習 Matplotlib 的基本術(shù)語(yǔ),具體來(lái)說(shuō)就是什么是 Figure 和 Axes。
2. 一直使用面向對象的界面,養成習慣。
3. 用基礎的 pandas 繪圖開(kāi)始可視化。
4. 使用 seaborn 進(jìn)行稍微復雜的數據可視化。
5. 使用 Matplotlib 自定義 pandas 或 seaborn 可視化。
下圖非常重要,有助于理解圖的不同術(shù)語(yǔ)。
大部分術(shù)語(yǔ)很直接易懂,需要牢記的是 Figure 是可能包含一或多個(gè) axes 的最終圖像。Axes 代表單個(gè)圖。一旦你理解這些是什么以及如何通過(guò)面向對象的 API 評估它們,其余步驟就很簡(jiǎn)單了。
了解這個(gè)知識還有一個(gè)好處,就是當你在網(wǎng)絡(luò )上看東西的時(shí)候有一個(gè)出發(fā)點(diǎn)。如果你花時(shí)間了解了這個(gè)點(diǎn),那么其他的 Matplotlib API 才有意義。此外,很多高級 Python 包,如 seaborn 和 ggplot 依賴(lài)于 Matplotlib 構建,因此理解了基礎,學(xué)習更強大的框架才更加容易。
最后,我不是說(shuō)你應該逃避其他優(yōu)秀選項,如 ggplot(又名 ggpy)、bokeh、plotly 或 altair。我只是認為你需要對 matplotlib + pandas + seaborn 有一個(gè)基礎的了解。了解基礎可視化棧之后,你就可以探索其他優(yōu)秀工具,根據需求做出合適的選擇。
開(kāi)始
下面主要介紹如何在 pandas 中創(chuàng )建基礎的可視化以及使用 Matplotlib 定制最常用的項。了解基礎流程有助于更直觀(guān)地進(jìn)行自定義。
我主要關(guān)注最常見(jiàn)的繪圖任務(wù),如標注軸、調整圖形界限(limit)、更新圖標題、保存圖像和調整圖例。
開(kāi)始,我打算設置輸入,讀取一些數據:
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter
df = pd.read_excel("https://github.com/chris1610/pbpython/blob/master/data/sample-salesv3.xlsx?raw=true")
df.head()
數據包括 2014 年的銷(xiāo)售交易額。為簡(jiǎn)短起見(jiàn),我將總結這些數據,列出前十名客戶(hù)的采購次數和交易額。繪圖時(shí)我將對各列進(jìn)行重命名。
top_10 = (df.groupby('name')['ext price', 'quantity'].agg({'ext price': 'sum', 'quantity': 'count'})
.sort_values(by='ext price', ascending=False))[:10].reset_index()
top_10.rename(columns={'name': 'Name', 'ext price': 'Sales', 'quantity': 'Purchases'}, inplace=True)
下圖是數據。
現在數據在簡(jiǎn)單的表格形式呈現,我們再來(lái)看一下如何將數據繪制成條形圖。如前所述,Matplotlib 具備多種不同風(fēng)格,可用于渲染圖表。你可以使用 plt.style.available 查看你的系統可用的風(fēng)格。
plt.style.available
['seaborn-dark',
'seaborn-dark-palette',
'fivethirtyeight',
'seaborn-whitegrid',
'seaborn-darkgrid',
'seaborn',
'bmh',
'classic',
'seaborn-colorblind',
'seaborn-muted',
'seaborn-white',
'seaborn-talk',
'grayscale',
'dark_background',
'seaborn-deep',
'seaborn-bright',
'ggplot',
'seaborn-paper',
'seaborn-notebook',
'seaborn-poster',
'seaborn-ticks',
'seaborn-pastel']
使用如下簡(jiǎn)單風(fēng)格:
plt.style.use('ggplot')
我鼓勵大家使用不同的風(fēng)格,找到自己喜歡的。
現在我們有了好看的風(fēng)格,第一步就是使用標準 pandas 繪圖函數繪制數據:
top_10.plot(kind='barh', y="Sales", x="Name")
推薦使用 pandas 繪圖的原因在于它是一種快速便捷地建立可視化原型的方式。
自定義圖表
如果你對該圖表的重要部分都很滿(mǎn)意,那么下一步就是對它執行自定義。一些自定義(如添加標題和標簽)可以使用 pandas plot 函數輕松搞定。但是,你可能會(huì )發(fā)現自己需要在某個(gè)時(shí)刻跳出來(lái)。這就是我推薦你養成以下習慣的原因:
fig, ax = plt.subplots()
top_10.plot(kind='barh', y="Sales", x="Name", ax=ax)
生成的圖表和原始圖表基本一樣,不過(guò)我們向 plt.subplots() 添加了一個(gè)額外的調用,并將 ax 傳輸至繪圖函數。為什么要這么做呢?還記得我說(shuō)在 Matplotlib 中獲取軸和圖像非常關(guān)鍵嗎?這里所做的就是為了達到該目的。通過(guò) ax 或 fig 對象可以執行任何自定義。
我們利用 pandas 實(shí)現快速繪圖,現在利用 Matplotlib 獲取所有功能。通過(guò)使用命名慣例,調整別人的解決方案適應自己的需求變得更加直接簡(jiǎn)單了。
假設我們想調整 x 極限,改變一些軸標簽?,F在我們在 ax 變量中有多個(gè)軸,可以進(jìn)行一些操作:
fig, ax = plt.subplots()
top_10.plot(kind='barh', y="Sales", x="Name", ax=ax)
ax.set_xlim([-10000, 140000])
ax.set_xlabel('Total Revenue')
ax.set_ylabel('Customer');
這是另一種改變標題和標簽的簡(jiǎn)單方式:
fig, ax = plt.subplots()
top_10.plot(kind='barh', y="Sales", x="Name", ax=ax)
ax.set_xlim([-10000, 140000])
ax.set(title='2014 Revenue', xlabel='Total Revenue', ylabel='Customer')
為了進(jìn)一步展示該方法,我們還可以調整圖像大小。使用 plt.subplots() 函數可以定義 figsize,以英寸為單位。我們還可以使用 ax.legend().set_visible(False) 移除圖例。
fig, ax = plt.subplots(figsize=(5, 6))
top_10.plot(kind='barh', y="Sales", x="Name", ax=ax)
ax.set_xlim([-10000, 140000])
ax.set(title='2014 Revenue', xlabel='Total Revenue')
ax.legend().set_visible(False)
要想修改這個(gè)圖像,你可能需要執行很多操作。圖中最礙眼的可能是總收益額的格式。Matplotlib 可以使用 FuncFormatter 解決這一問(wèn)題。該函數用途多樣,允許用戶(hù)定義的函數應用到值,并返回格式美觀(guān)的字符串。
以下是貨幣格式化函數,用于處理數十萬(wàn)美元區間的數值:
def currency(x, pos):
'The two args are the value and tick position'
if x >= 1000000:
return '${:1.1f}M'.format(x*1e-6)
return '${:1.0f}K'.format(x*1e-3)
現在我們有了格式化程序函數,就需要定義它,并將其應用到 x 軸。完整代碼如下:
fig, ax = plt.subplots()
top_10.plot(kind='barh', y="Sales", x="Name", ax=ax)
ax.set_xlim([-10000, 140000])
ax.set(title='2014 Revenue', xlabel='Total Revenue', ylabel='Customer')
formatter = FuncFormatter(currency)
ax.xaxis.set_major_formatter(formatter)
ax.legend().set_visible(False)
這張圖美觀(guān)多了,非常好地展示了自定義問(wèn)題解決方案的靈活性。最后要說(shuō)的自定義特征是向圖表添加注釋。你可以使用 ax.axvline() 畫(huà)垂直線(xiàn),使用 ax.text() 添加自定義文本。就以上示例,我們可以畫(huà)一條表示平均值的線(xiàn),包括代表 3 個(gè)新客戶(hù)的標簽。以下是完整代碼:
# Create the figure and the axes
fig, ax = plt.subplots()
# Plot the data and get the averaged
top_10.plot(kind='barh', y="Sales", x="Name", ax=ax)
avg = top_10['Sales'].mean()
# Set limits and labels
ax.set_xlim([-10000, 140000])
ax.set(title='2014 Revenue', xlabel='Total Revenue', ylabel='Customer')
# Add a line for the average
ax.axvline(x=avg, color='b', label='Average', linestyle='--', linewidth=1)
# Annotate the new customers
for cust in [3, 5, 8]:
ax.text(115000, cust, "New Customer")
# Format the currency
formatter = FuncFormatter(currency)
ax.xaxis.set_major_formatter(formatter)
# Hide the legend
ax.legend().set_visible(False)
這可能不是最壯觀(guān)的圖,但它確實(shí)展示了使用該方法的力量。
圖表
目前,我們所做的所有改變都是針對單個(gè)圖表。我們還能夠在圖像上添加多個(gè)表,使用不同的選項保存整個(gè)圖像。
如果我們確定要在同一個(gè)圖像上放置兩個(gè)表,那么我們應該對如何做有一個(gè)基礎了解。首先,創(chuàng )建圖像,然后創(chuàng )建軸,再將它們繪制成圖表。使用 plt.subplots() 可以完成該操作:
fig, (ax0, ax1) = plt.subplots(nrows=1, ncols=2, sharey=True, figsize=(7, 4))
在這個(gè)例子中,我使用 nrows 和 ncols 指定大小,這對新用戶(hù)來(lái)說(shuō)比較清晰易懂。
在示例代碼中,你會(huì )經(jīng)??吹阶兞咳?1、2。我認為使用命名參數便于稍后查看代碼時(shí)理解代碼。
我還使用 sharey=True 以使 y 軸共享相同的標簽。
該示例很靈活,因為不同的軸可以解壓成 ax0 和 ax1?,F在我們有了這些軸,就可以像上述示例中那樣繪圖,然后把一個(gè)圖放在 ax0 上,另一個(gè)圖放在 ax1。
# Get the figure and the axes
fig, (ax0, ax1) = plt.subplots(nrows=1,ncols=2, sharey=True, figsize=(7, 4))
top_10.plot(kind='barh', y="Sales", x="Name", ax=ax0)
ax0.set_xlim([-10000, 140000])
ax0.set(title='Revenue', xlabel='Total Revenue', ylabel='Customers')
# Plot the average as a vertical line
avg = top_10['Sales'].mean()
ax0.axvline(x=avg, color='b', label='Average', linestyle='--', linewidth=1)
# Repeat for the unit plot
top_10.plot(kind='barh', y="Purchases", x="Name", ax=ax1)
avg = top_10['Purchases'].mean()
ax1.set(title='Units', xlabel='Total Units', ylabel='')
ax1.axvline(x=avg, color='b', label='Average', linestyle='--', linewidth=1)
# Title the figure
fig.suptitle('2014 Sales Analysis', fontsize=14, fontweight='bold');
# Hide the legends
ax1.legend().set_visible(False)
ax0.legend().set_visible(False)
現在,我已經(jīng)在 jupyter notebook 中用 %matplotlib inline 展示了很多圖像。但是,在很多情況下你需要以特定格式保存圖像,將其和其他呈現方式整合在一起。
Matplotlib 支持多種不同文件保存格式。你可以使用 fig.canvas.get_supported_filetypes() 查看系統支持的文件格式:
fig.canvas.get_supported_filetypes()
{'eps': 'Encapsulated Postscript',
'jpeg': 'Joint Photographic Experts Group',
'jpg': 'Joint Photographic Experts Group',
'pdf': 'Portable Document Format',
'pgf': 'PGF code for LaTeX',
'png': 'Portable Network Graphics',
'ps': 'Postscript',
'raw': 'Raw RGBA bitmap',
'rgba': 'Raw RGBA bitmap',
'svg': 'Scalable Vector Graphics',
'svgz': 'Scalable Vector Graphics',
'tif': 'Tagged Image File Format',
'tiff': 'Tagged Image File Format'}
我們有 fig 對象,因此我們可以將圖像保存成多種格式:
fig.savefig('sales.png', transparent=False, dpi=80, bbox_inches="tight")
該版本將圖表保存為不透明背景的 png 文件。我還指定 dpi 和 bbox_inches="tight" 以最小化多余空白。
結論
希望該方法可以幫助大家理解如何更有效地使用 Matplotlib 進(jìn)行日常數據分析。
版權聲明: 本站僅提供信息存儲空間服務(wù),旨在傳遞更多信息,不擁有所有權,不承擔相關(guān)法律責任,不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責。如因作品內容、版權和其它問(wèn)題需要同本網(wǎng)聯(lián)系的,請發(fā)送郵件至 舉報,一經(jīng)查實(shí),本站將立刻刪除。