数据分析_Python作图
Python作圖
- 概述
- 選圖_根據(jù)目的
- 選圖_根據(jù)數(shù)據(jù)關(guān)系
- 常用圖介紹及代碼實(shí)現(xiàn)
- 散點(diǎn)圖
- 折線圖
- 直方圖
- 條形圖
- 箱線圖
- 餅圖
- 熱力圖
- 蜘蛛圖
- 二元變量分布
- 成對(duì)關(guān)系
- 總結(jié):
概述
工作時(shí)有時(shí)候有些數(shù)據(jù)在用Python處理完直接作圖比較方便。下面敘述一下日常作圖的步驟和常用的圖表實(shí)現(xiàn)方式。玫瑰圖等比較帥的圖的做法后續(xù)補(bǔ)上。可視化要是做的好還是挺能吸人眼球的,而且python也能實(shí)現(xiàn)比較復(fù)雜的作圖。
選圖_根據(jù)目的
畫圖第一步就是要決定使用哪種圖,使用哪種圖取決于作圖目的,上面列出9種,每種下面都有對(duì)應(yīng)的基礎(chǔ)圖形(哪些就不用說了),根據(jù)需求選擇。
選圖_根據(jù)數(shù)據(jù)關(guān)系
如果上面的方式?jīng)]辦法掌握,就按照想要呈現(xiàn)的數(shù)據(jù)關(guān)系進(jìn)行選擇。
比較:比較數(shù)據(jù)間各類別的關(guān)系,或者是它們隨著時(shí)間的變化趨勢(shì),比如折線圖。
聯(lián)系:查看兩個(gè)或兩個(gè)以上變量之間的關(guān)系,比如散點(diǎn)圖。
構(gòu)成:每個(gè)部分占整體的百分比,或者是隨著時(shí)間的百分比變化,比如餅圖。
分布:關(guān)注單個(gè)變量,或者多個(gè)變量的分布情況,比如直方圖。
常用圖介紹及代碼實(shí)現(xiàn)
散點(diǎn)圖
特點(diǎn):非常適合展示兩個(gè)變量之間的關(guān)系。當(dāng)然,除了二維的散點(diǎn)圖,還有三維的散點(diǎn)圖。具體實(shí)現(xiàn)如下:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline # 數(shù)據(jù)準(zhǔn)備 N = 1000 x = np.random.randn(N) y = np.random.randn(N) # 用Matplotlib畫散點(diǎn)圖 plt.scatter(x, y,marker='x',c = 'g') plt.show() # 用Seaborn畫散點(diǎn)圖 df = pd.DataFrame({'x': x, 'y': y}) sns.jointplot(x="x", y="y", data=df, kind='scatter',); sns.set_style('whitegrid') plt.show()- Matplotlib:marker 代表了標(biāo)記的符號(hào)。比如“x”、“>”或者“o”
- Seaborn:其中 x、y 是 data 中的下標(biāo)。data 就是我們要傳入的數(shù)據(jù),一般是 DataFrame 類型。kind 這類我們?nèi)?scatter,代表散點(diǎn)的意思。 kind 還可以取其他值,后面說,不同的 kind 代表不同的視圖繪制方式。
Matplotlib:
Seaborn:
區(qū)別:Matplotlib 默認(rèn)情況下呈現(xiàn)出來的是個(gè)長(zhǎng)方形。而 Seaborn 呈現(xiàn)的是個(gè)正方形,而且不僅顯示出了散點(diǎn)圖,還給了這兩個(gè)變量的分布情況。
折線圖
特點(diǎn):可以用來表示數(shù)據(jù)隨著時(shí)間變化的趨勢(shì)。
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline # 數(shù)據(jù)準(zhǔn)備 x = [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019] y = [5, 3, 6, 20, 17, 16, 19, 30, 32, 35] # 使用Matplotlib畫折線圖 plt.plot(x, y) plt.show() # 使用Seaborn畫折線圖 df = pd.DataFrame({'x': x, 'y': y}) sns.lineplot(x="x", y="y", data=df) plt.show()- Matplotlib:需要提前把數(shù)據(jù)按照 x 軸的大小進(jìn)行排序,要不畫出來的折線圖就無法按照 x 軸遞增的順序展示。
Matplotlib:
Seaborn:
區(qū)別:在 seaborn 中標(biāo)記了 x 和 y 軸的含義,散點(diǎn)圖也是加了坐標(biāo)軸含義。
直方圖
特點(diǎn):側(cè)重于分布,直方圖是比較常見的視圖,它是把橫坐標(biāo)等分成了一定數(shù)量的小區(qū)間,這個(gè)小區(qū)間也叫作“箱子”,然后在每個(gè)“箱子”內(nèi)用矩形條(bars)展示該箱子的箱子數(shù)(也就是 y 值),這樣就完成了對(duì)數(shù)據(jù)集的直方圖分布的可視化。
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 數(shù)據(jù)準(zhǔn)備 a = np.random.randn(100) s = pd.Series(a) # 用Matplotlib畫直方圖 plt.hist(s) plt.show() # 用Seaborn畫直方圖 sns.distplot(s, kde=True) plt.show() sns.distplot(s, kde=False) plt.show()Matplotlib:
Seaborn(核密度估計(jì))
Seaborn(無核密度估計(jì))
區(qū)別:Seaborn帶核密度估計(jì),默認(rèn)顏色比較小清新,低飽和度。
條形圖
特點(diǎn):如果說通過直方圖可以看到變量的數(shù)值分布,那么條形圖可以幫我們查看類別的特征(頻數(shù))。做成動(dòng)態(tài)排行會(huì)很好看。
import matplotlib.pyplot as plt import seaborn as sns # 數(shù)據(jù)準(zhǔn)備 x = ['Cat1', 'Cat2', 'Cat3', 'Cat4', 'Cat5'] y = [5, 4, 8, 12, 7] # 用Matplotlib畫條形圖 plt.bar(x, y) plt.show() # 用Seaborn畫條形圖 sns.barplot(x, y) plt.show()- Seaborn:sns.barplot(x=None, y=None, data=None),還是可以用DataFrame格式,感覺這是Seaborn的通用格式。
Mathplotlib:
Seaborn:
區(qū)別:Seaborn默認(rèn)不是單色
箱線圖
特點(diǎn):又稱盒式圖,由五個(gè)數(shù)值點(diǎn)組成:最大值 (max)、最小值 (min)、中位數(shù) (median) 和上下四分位數(shù) (Q3, Q1)。它可以幫我們分析出數(shù)據(jù)的差異性、離散程度和異常值等。可以應(yīng)用在去除噪聲數(shù)據(jù)。
# 數(shù)據(jù)準(zhǔn)備 # 生成10*4維度數(shù)據(jù) data=np.random.normal(size=(10,4)) lables = ['A','B','C','D'] # 用Matplotlib畫箱線圖 plt.boxplot(data,labels=lables) plt.show() # 用Seaborn畫箱線圖 df = pd.DataFrame(data, columns=lables) sns.boxplot(data=df) plt.show()- numpy.random.normal(loc=0.0, scale=1.0, size=None),概率分布的均值,scale:概率分布的標(biāo)準(zhǔn)差(對(duì)應(yīng)于分布的寬度,scale越大越矮胖,scale越小,越瘦高)size:輸出的shape,默認(rèn)為None,只輸出一個(gè)值。loc=0.0, scale=1.0就是正態(tài)分布。
Matplotlib:
Seborn:
區(qū)別:Style不同。
餅圖
特點(diǎn):常用在統(tǒng)計(jì)學(xué)模塊,可以顯示每個(gè)部分大小與總和之間的比例。在 Python 數(shù)據(jù)可視化中,它用的不算多。我們主要采用 Matplotlib 的 pie 函數(shù)實(shí)現(xiàn)它。
import matplotlib.pyplot as plt # 數(shù)據(jù)準(zhǔn)備 nums = [25, 37, 33, 37, 6] labels = ['High-school','Bachelor','Master','Ph.d', 'Others'] # 用Matplotlib畫餅圖 plt.pie(x = nums, labels=labels) plt.show()熱力圖
特點(diǎn):熱力圖是一種矩陣表示方法,其中矩陣中的元素值用顏色來代表,不同的顏色代表不同大小的值。通過顏色就能直觀地知道某個(gè)位置上數(shù)值的大小。
import matplotlib.pyplot as plt import seaborn as sns # 數(shù)據(jù)準(zhǔn)備 flights = sns.load_dataset("flights") data=flights.pivot('year','month','passengers') # 用Seaborn畫熱力圖 sns.heatmap(data) plt.show()- 這里我們使用 Seaborn 中自帶的數(shù)據(jù)集 flights,該數(shù)據(jù)集記錄了 1949 年到 1960 年期間,每個(gè)月的航班乘客的數(shù)量。
蜘蛛圖
特點(diǎn):顯示一對(duì)多關(guān)系的方法。在蜘蛛圖中,一個(gè)變量相對(duì)于另一個(gè)變量的顯著性是清晰可見的。
import numpy as np import matplotlib.pyplot as plt import seaborn as sns from matplotlib.font_manager import FontProperties %matplotlib inline # 數(shù)據(jù)準(zhǔn)備 labels=np.array([u"推進(jìn)","KDA",u"生存",u"團(tuán)戰(zhàn)",u"發(fā)育",u"輸出"]) stats=[83, 61, 95, 67, 76, 88] # 畫圖數(shù)據(jù)準(zhǔn)備,角度、狀態(tài)值 angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False) stats=np.concatenate((stats,[stats[0]])) angles=np.concatenate((angles,[angles[0]])) # 用Matplotlib畫蜘蛛圖 fig = plt.figure() ax = fig.add_subplot(111, polar=True) ax.plot(angles, stats, 'o-', linewidth=2) ax.fill(angles, stats, alpha=0.25) # 設(shè)置中文字體 font = FontProperties(fname=r"C:\Windows\Fonts\simhei.ttf", size=14) ax.set_thetagrids(angles * 180/np.pi, labels, FontProperties=font) plt.show()- 需要在原有 angles 和 stats 數(shù)組上增加一位,也就是添加數(shù)組的第一個(gè)元素,加上之后才可以構(gòu)成一個(gè)環(huán)。
- 字符前加u是用unicode編碼,中文需要,英文一般不用。
- np.linspace(start,end,num,endpoint)用于生成等差數(shù)列,endpoint=False代表不排除終點(diǎn)。
- flt.figure 是創(chuàng)建一個(gè)空白的 figure 對(duì)象,這樣做的目的相當(dāng)于畫畫前先準(zhǔn)備一個(gè)空白的畫板。然后 add_subplot(111) 可以把畫板劃分成 1 行 1 列。再用 ax.plot 和 ax.fill 進(jìn)行連線以及給圖形上色。
- 中文字體simhei.ttf下載鏈接:http://www.downcc.com/font/7665.html
- ax.fill(angles, stats, alpha=0.25) ,alpha=0.25代表蛛網(wǎng)部分透明度。
二元變量分布
特點(diǎn):如果我們想要看兩個(gè)變量之間的關(guān)系,就需要用到二元變量分布。在 Seaborn 里,使用二元變量分布非常方便, sns.jointplot(x, y, data=None, kind) 函數(shù)即可。其中用 kind 表示不同的視圖類型:“kind=‘scatter’”代表散點(diǎn)圖,“kind=‘kde’”代表核密度圖,“kind=‘hex’ ”代表 Hexbin 圖,它代表的是直方圖的二維模擬。
import matplotlib.pyplot as plt import seaborn as sns # 數(shù)據(jù)準(zhǔn)備 tips = sns.load_dataset("tips") print(tips.head(10)) # 用Seaborn畫二元變量分布圖(散點(diǎn)圖,核密度圖,Hexbin圖) sns.jointplot(x="total_bill", y="tip", data=tips, kind='scatter') sns.jointplot(x="total_bill", y="tip", data=tips, kind='kde') sns.jointplot(x="total_bill", y="tip", data=tips, kind='hex') plt.show()- 這里我們使用 Seaborn 中自帶的數(shù)據(jù)集 tips,這個(gè)數(shù)據(jù)集記錄了不同顧客在餐廳的消費(fèi)賬單及小費(fèi)情況。代碼中 total_bill 保存了客戶的賬單金額,tip 是該客戶給出的小費(fèi)金額。我們可以用 Seaborn 中的 jointplot 來探索這兩個(gè)變量之間的關(guān)系。
散點(diǎn)圖:
核密度圖:
Hexbin 圖:
成對(duì)關(guān)系
特點(diǎn):探索數(shù)據(jù)集中的多個(gè)成對(duì)雙變量的分布,可以直接采用 sns.pairplot() 函數(shù)。它會(huì)同時(shí)展示出 DataFrame 中每對(duì)變量的關(guān)系,另外在對(duì)角線上,你能看到每個(gè)變量自身作為單變量的分布情況。pairplot 函數(shù)的使用,就像在 DataFrame 中使用 describe() 函數(shù)一樣方便,是數(shù)據(jù)探索中的常用函數(shù)。
import matplotlib.pyplot as plt import seaborn as sns # 數(shù)據(jù)準(zhǔn)備 iris = sns.load_dataset('iris') # 用Seaborn畫成對(duì)關(guān)系 sns.pairplot(iris) plt.show()-
總結(jié):
總結(jié)
以上是生活随笔為你收集整理的数据分析_Python作图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 卡西欧CDP-100对战雅马哈镎-30
- 下一篇: 毕业设计-基于微信小程序的社区健康教育系