資料可視化
基本概念
資料可視化是指借助于圖形化的手段,清晰、快捷有效的傳達與溝通資訊。同時,也可以輔助使用者做出相應的判斷,更好的去洞悉資料背後的價值。
字不如表,表不如圖。
觀察号碼的頻率,每個号碼出現了多少次?
文字
08 10 15 20 30 31 33 06
01 09 10 17 21 28 32 13
02 05 08 13 19 21 28 10
03 05 07 14 18 23 25 07
…… ……
表格
圖形
通過可視化圖表方式,就可以清晰的表達資訊
可視化圖形輔助決策
1854 年英國倫敦霍亂病流行時,斯諾博士在繪有霍亂流行地區所有道路、房屋、飲用水機井等内容的城區地圖上,标出了每個霍亂病死者的住家位置,得到了霍亂病死者居住位置分布圖,發現了霍亂病源之所在:布勞德大街(現布勞維克大街)的公用抽水機
matplotlib
matplotlib是用于Python的繪圖庫,提供各種常用圖形的繪制。例如,條形圖,柱形圖,線圖,散點圖等。
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
圖形繪制
繪制線圖
可以通過matplotlib.pyplot的plot方法進行圖形繪制。
- plot(y)
- plot(y, '格式')
- plot(x, y)
- plot(x, y, '格式')
- plot(x1, y1, '格式1', x2, y2, '格式2' …… xn, yn, 格式n)
# 繪制一個點,點預設情況下是不顯示的。如果需要讓點能夠顯示,需要設定(marker參數可以設定點顯示的形狀)。
# plt.plot(50, marker="d")
# 繪制多個資料,構成線型形狀。如果我們隻提供一組數組,則該組資料表示縱坐标,橫坐标預設從0開始,1,2,3,4進行排列。
# plt.plot([3, 2, 9, 15, -3], marker="o")
# 我們也可以自己來指定橫坐标。提供兩組資料。第1個清單指定橫坐标,第2個清單指定縱坐标。
# plt.plot([-3, -1, 5, 8, 12], [2, -10, 9, 3, 6], marker="o")
# 我們在繪制圖形的時候,可以指定點的形狀,線的形狀,線條顔色等設定。
# plt.plot([-3, -1, 5, 8, 12], [2, -10, 9, 3, 6], "y-.>")
# 繪制多個資料,每個資料給予不同的格式。
# plt.plot([-3, -9], [32, 18], "r--D", [5, 8], [-10, 20], "g-.o")
# 以上的方式,我們也可以分成兩步來進行繪制。
plt.plot([-3, -9], [32, 18], "r--D")
plt.plot([5, 8], [-10, 20], "g-.o")
[<matplotlib.lines.Line2D at 0x1c986a6d080>]
圖形互動式設定
我們可以設定jupyter notebook圖形是否互動式顯示,預設為否。
- %matplotlib 引擎名
- %matplotlib inline
# %matplotlib qt
%matplotlib inline
plt.plot([5, 8], [-10, 20], "g-.o")
[<matplotlib.lines.Line2D at 0x20f80f3e0b8>]
設定中文支援
matplotlib預設情況下不支援中文顯示,如果需要顯示中文,則我們需要做一些額外的設定操作。設定可以分為:
- 全局設定
- 局部設定
全局設定
我們可以通過執行:
mpl.rcParams["font.family"] = "中文字型名稱"
mpl.rcParams["axes.unicode_minus"]=False
進行設定。常用的設定如下:
- font.family 字型的名稱
- sans-serif 西文字型(預設)
- SimHei 中文黑體
- FangSong 中文仿宋
- YouYuan 中文幼圓
- STSong 華文宋體
- Kaiti 中文楷體
- LiSu 中文隸書
- font.style 字型的風格
- normal 正常(預設)
- italic 斜體
- oblique 傾斜
- font.size 字型的大小(預設10)
- axes.unicode_minus 是否使用Unicode的減号(負号)【在支援中文顯示狀态下,需要設定為False】
局部設定
在需要顯式的文字中,使用fontproperties參數進行設定。
說明:
- 如果全局設定與局部設定沖突,以局部設定為準。
# 對字型進行設定。預設的字型不支援中文顯示,我們隻需設定一種支援中文顯示的字型即可。
mpl.rcParams["font.family"] = "Kaiti"
# 對于西方文字,使用普通的負号來顯示,無需設定該選項。當設定支援中文的字型時,會使用Uniocde的負号來進行顯示(不支援)。故需要将
# 負号顯示成普通的形式,而不是使用Unicdoe的負号顯示。
mpl.rcParams["axes.unicode_minus"] = False
mpl.rcParams["font.style"] = "normal"
mpl.rcParams["font.size"] = 10
plt.plot([-3, -2],[-1, -5], "r--")
# 顯示标題
plt.title("中文")
# 局部設定
plt.title("中文", fontproperties="Kaiti", fontsize=20)
Text(0.5, 1.0, '中文')
儲存圖表
通過plt的savefig方法将目前的圖形儲存到硬碟或者類檔案對象中。
- dpi:每英寸分辨率點數。
- facecolor:設定圖像的背景色。
- bbox_inches:設定為tight,可以緊湊儲存圖像。
-
# savefig圖表儲存 # 1 儲存到硬碟上 plt.plot([1, 5, 8, 10], [2, 3, 9, 6], "r-.o") plt.savefig("./1.png", dpi=100, facecolor="g", bbox_inches="tight") # 2 儲存到類檔案對象中 # from io import BytesIO # data = BytesIO() # plt.savefig(data) # data.read() # data.getvalue()[:100] from PIL import Image # 從硬碟讀取檔案 image = Image.open("./1.png") # 從類檔案對象中讀取資訊 # image = Image.open(data) image.show()
顔色,點标記與線型設定
我們可以在繪制圖形時,顯式指定圖形的顔色,點标記或線條形狀。具體設定可以檢視幫助文檔。
- color(c):線條顔色。
- linestyle(ls):線條形狀。
- linewidth(lw):線寬。
- marker:點标記形狀。
- markersize(ms):點标記的大小。
- markeredgecolor(mec):點邊緣顔色。
- markeredgewidth(mew):點邊緣寬度。
- markerfacecolor(mfc):點的顔色。
說明:
- 顔色,點标記與線型可以使用一個參數進行設定。
- 顔色除了可以使用預設簡寫的字元之外,也可以使用全稱(例如red)也可以使用RGB顔色表示。
# plt.plot([1, 2, 3, 4], [5, 6, 7, 8], "ro--")
plt.plot([1, 2, 3, 4], [5, 6, 7, 8], c="r", ls="--", lw=2, marker="o", ms=15, mec="r", mew=5, mfc="y")
[<matplotlib.lines.Line2D at 0x1c986f302b0>]
透明度設定
在繪制圖像時,我們可以通過alpha參數來控制圖像的透明度,值在0 ~ 1之間。0為完全透明,1為不透明。
plt.plot(np.arange(30), marker="D", alpha=0.7)
[<matplotlib.lines.Line2D at 0x20f80f6ab00>]
圖例設定
在繪制多條線時,可以設定圖例來标注每條線所代表的含義,使圖形更加清晰易懂。
可以采用如下的方式設定圖例:
- 調用plt的legend函數,傳遞一個标簽數組,指定每次plot圖形的标簽。
- 在繪制的時候通過label參數指定圖例中顯示的名稱,然後調用legend函數生成圖例。
legend常用的參數:
- loc:指定圖例的位置。預設為best。也可以指定坐标(元組),基于圖像左下角計算。
- frameon:設定是否含有邊框。
- title:設定圖例的标題。
- ncol:圖例顯示的列數,預設為1。
# 可以采用兩種方式。
# plt.legend設定顯示圖例。
# 1 第一中方式,繪圖時不指定标簽,而在legend方法中指定标簽。
plt.plot(list(range(1, 13)), np.random.randint(50, 100, 12))
plt.plot(list(range(1, 13)), np.random.randint(50, 100, 12))
# loc 控制圖例的顯示位置,預設為best,即選擇一個最好的位置。
plt.legend(["2016", "2017"], loc="upper right")
# legend也可以指定元組的坐标。(坐标的值基于目前圖形的比例。)
# plt.legend(["2016", "2017"], loc=(0.6, 0.5))
# frameon是否顯示圖例的邊框,True(預設值)顯示,False不顯示。
# plt.legend(["2016", "2017"], loc="best", frameon=False)
# plt.legend(["2016", "2017"], loc="best", title="年降雨量", ncol=2)
# 2 第2種方式:在繪圖時指定标簽,在legend中不指定。
# 通過label參數指定标簽資訊。該資訊可以用來當做legend的圖例标簽。
plt.plot(list(range(1, 13)), np.random.randint(50, 100, 12), label="2016")
plt.plot(list(range(1, 13)), np.random.randint(50, 100, 12), label="2017")
plt.legend(loc="best")
網格設定
可以通過plt的grid方法來設定是否顯示網格。True為顯示,False不顯示。ax.grid(color='r', linestyle='-', linewidth=2)
- color:設定網格線顔色
- axis:設定網格線顯示x,y或者全部顯示(x,y,both)。
- linestyle:設定網格線形狀。
- linewidth:設定網格線寬度。
plt.plot([1, 2], [3, 4])
plt.grid(True, color="y", axis="y", ls="--", lw=5)
繪圖區域設定
我們可以在一張圖上繪制多個圖形,當然,我們也可以将不同的圖形繪制到多個不同的區域當中。
我們可以采用以下方式來實作多個區域的繪制(建立子繪圖區域):
- 通過Figure對象調用add_subplot方法。
- 通過plt的subplot方法。
- 通過plt的subplots方法。
子區域1:add_subplot方法
- 首先建立matplotlib.figure.Figure對象,然後通過Figure對象的add_subplot方法增加子繪圖區域。
- add_subplot方法中,需要指定子區域的行數、列數與目前要繪制的子區域。
- add_subplot方法會傳回子繪圖對象(軸對象),通過該對象即可實作繪圖(matplotlib.axes._subplots.AxesSubplot)。
在繪制圖形時,總是需要建立Figure對象。如果沒有顯式建立,則plt會隐式建立一個Figure對象。在繪制圖形時,既可以使用plt來繪制,也可以使用子繪圖對象來繪制。
如果使用plt對象繪制,則總是在最後建立的繪圖區域上進行繪制,如果此時尚未建立繪圖區域,則會自動建立。
說明:
- add_subplot方法的參數,即可以使用三個參數分開傳遞,也可以使用一個參數整體傳遞。
- 可以通過plt.subplots_adjust方法來調整子繪圖的位置與子繪圖之間的距離。(left, right, top, bottom, wspace, hspace)
- 建立子區域時,可以使用facecolor設定繪圖區域的背景色。
# 建立Figure對象。在我們進行繪圖時,一定會存在Figure對象,如果我們沒有顯式建立,也會隐式建立。
figure = plt.figure()
# 建立一個子繪圖區域,分别指定行數(第1個參數),列數(第2個參數),目前的自繪圖區域(第3個參數)。
figure.add_subplot(1, 2, 1, facecolor="g")
plt.plot(10, marker="o")
# 三個參數也可以作為一個參數整體傳遞
figure.add_subplot("122")
# figure.add_subplot(1, 2, 2)
plt.plot(20, marker="d")
# 在調用add_subplot方法時,會傳回所建立的子繪圖區域對象。我們既可以通過plt.plot進行繪制,也可以通過子繪圖區域的plot方法
# 進行繪制。
# sub = figure.add_subplot(1, 2, 1)
# sub.plot([1, 2, 3], [5, 6, 8], "g")
# 當我們使用plt.plot進行繪制時,總是在最後激活(建立)的子繪圖區域上進行繪制。
# sub2 = figure.add_subplot(1, 2, 2)
# plt.plot([3, 8, 9], [12, 9, 0], "y")
# 調整水準的間距。
plt.subplots_adjust(wspace=1)
子區域2:subplot方法
通過調用plt的subplot方法建立子繪圖區域,該方法傳回子繪圖對象。此處方式下,會隐式建立Figure對象。
實際上,這種建立子繪圖區域的方式,底層也是通過第一種方式實作的。
#subplot(行, 列, 目前位置)
plt.subplot(1, 2, 1)
plt.plot([3, 8, 3], "g--d")
plt.subplot(1, 2, 2)
plt.plot([3, 8, 9], "r-.o")
子區域3:subplots方法
通過plt的subplots方法建立子繪圖區域,該方法傳回一個元組(Figure對象與所有子繪圖對象,如果是多個子繪圖對象,則傳回一個ndarray數組)。可以通過sharex與sharey來指定是否共享x軸與y軸。
# 傳回元組, 第1個元素,Figure對象,第2個元素:子繪圖區域對象。
# 如果我們建立多個子繪圖區域對象,則多個子繪圖區域對象會存放在ndarray中。
figure, ax = plt.subplots(2, 2, sharex=True, sharey=True)
ax[0][0].plot([3, 9])
ax[0][1].plot([3, 9])
ax[1][0].plot([3, 9])
ax[1][1].plot([3, 9])
繪圖區域大小設定
如果繪圖子區域較多,可能會有些擁擠。此時,我們可以調整繪圖區域的大小。方式如下:
- 在調用
建立Figure對象時,通過figsize參數指定。機關為英寸。plt.figure()
- 在建立Figure對象後,可以通過Figure對象的set_size_inches方法設定。
說明:
- 如果沒有顯式建立Figure對象,可以通過plt的gcf函數擷取目前的Figure對象。
# 在建立Figure對象時,通過figsize參數指定繪圖區域的大小。
# plt.figure(figsize=(3, 3))
# 我們也可以在建立Figure對象之後,通過set_size_inches來設定區域大小。
# figure = plt.figure()
# figure.set_size_inches(5, 5)
# plt.plot([1, 2, 4])
# 擷取目前的figure對象。
# 如果沒有顯式建立Figure對象,我們可以通過plt.gcf擷取目前使用的figure,同樣可以設定繪圖區域的大小。
figure2 = plt.gcf()
# display(figure is figure2)
figure2.set_size_inches(5, 5)
plt.plot([1, 2, 3])
标簽與刻度設定
可以通過plt對象的相關方法來設定(或擷取)标簽與刻度等資訊。設定還是擷取,取決于是否傳遞實際參數。
- plt.xlim 設定或擷取x軸刻度範圍。
- plt.ylim 設定或擷取y軸刻度範圍。
- plt.xticks 設定或擷取x軸顯示的刻度與标簽。
- plt.yticks 設定或擷取y軸顯示的刻度與标簽。
- plt.axis 可以同時設定或擷取x與y軸的刻度範圍,或者是取消刻度顯示。
- 無參數:傳回一個元組。(xmin, xmax, ymin, ymax)
- (xmin, xmax, ymin, ymax) 同時設定x與y軸的刻度範圍。
- off 取消坐标軸顯示。
- tight:坐标軸緊湊顯示。
- equal:x與y具有同樣的長度。
軸标簽說明與标題設定
- plt.xlabel 設定x軸的标簽說明。
- plt.ylabel 設定y軸的标簽說明。
- plt.title 設定标題。
plt.plot([1, 3, 5], [2, 4, 6])
# 顯示x軸刻度的範圍
display(plt.xlim())
# 顯示y軸刻度的傳回
display(plt.ylim())
# 除了擷取之外,我們也可以去設定x與y軸的刻度範圍。
plt.xlim(0, 10)
plt.ylim(-2, 10)
# 擷取x與y的刻度資訊。
# plt.xticks()
# plt.yticks()
# 設定x與y的刻度資訊
plt.xticks([0, 5, 10])
plt.yticks([-2, 4, 10])
# 預設情況下,标簽就是我們設定的刻度資訊。我們可以自定義每個刻度的顯示标簽。
plt.xticks([0, 5, 10], ["偏低", "中等", "偏高"])
(0.8, 5.2)
(1.8, 6.2)
([<matplotlib.axis.XTick at 0x1c98824cd30>,
<matplotlib.axis.XTick at 0x1c98824c7f0>,
<matplotlib.axis.XTick at 0x1c98824c518>],
<a list of 3 Text xticklabel objects>)
# axis的使用
# plt.plot([1, 3, 5], [2, 4, 6])
# 可以通過axis來設定或者傳回x與y軸的界限。
# 擷取
plt.axis()
# 設定 (xmin, xmax, ymin, ymax)
# plt.axis((0, 10, -5, 10))
# 去掉坐标軸
# plt.axis("off")
plt.plot([1, 2, 3], [1, 10, 20])
# 讓x與y軸具有相同的增長度(比例相同)
# plt.axis("equal")
# 設定坐标軸的标簽與标題
plt.plot([1, 2, 3])
# 設定x軸的标簽資訊
plt.xlabel("這是x軸")
plt.ylabel("這是y軸")
# 設定标題資訊
plt.title("這是标題")
Text(0.5,1,'這是标題')
通過繪圖對象設定
除了通過plt對象外,我們還可以通過子繪圖對象來設定與擷取标簽與刻度。
- ax.set_xlim 設定x軸刻度範圍。
- ax.get_xlim 擷取x軸刻度範圍。
- ax.set_xticks 設定x軸顯示的刻度。
- ax.get_xticks 擷取x軸顯示的刻度。
- ax.set_xticklabels 設定x軸顯示的刻度标簽。預設顯示的是就是刻度值。
- ax.get_xticklabels 擷取x軸顯示的刻度标簽。
也可以設定标簽說明與标題。
- ax.set_xlabel 設定x軸的标簽說明。
- ax.get_xlabel 擷取x軸的标簽說明。
- ax.set_title 設定标題。
- ax.get_title 擷取标題。
說明:
- 如果需要設定或者擷取y軸,隻需要将x換成y即可。
# 除了使用plt進行設定刻度,坐标軸,标簽等資訊外,我們也可以通過繪圖對象來進行設定。
figure, ax = plt.subplots(1, 1)
ax.plot(np.random.random(100))
# 設定x軸的顯示範圍
# ax.set_xlim(0, 120)
# 擷取x軸的顯示範圍
# ax.get_xlim()
# ax.get_xticks()
ax.set_xticks([50, 100, 150])
ax.set_xticklabels(["低", "中", "高"])
# for i in ax.get_xticklabels():
# display(i)
ax.set_xlabel("時間")
ax.set_ylabel("數值大小")
# ax.get_xlabel()
ax.set_title("波動值")
ax.get_title()
'波動值'
添加注解
我們可以在圖形上繪制文本等說明資訊(注解)。
普通文本
plt.text 顯示文本(基于坐标)
plt.figtext 顯示文本(基于圖檔)
箭頭
plt.arrow 根據起點坐标(x,y)與各自軸的長度(x + dx, y + dy)繪制箭頭。
- width 箭頭尾部的寬度。
- head_width 箭頭的寬度。
- head_length 箭頭的長度。
箭頭與文本
plt.annotate 顯示箭頭與文本。
- xy 箭頭指向坐标
- xytext 文本起點坐标。(箭頭尾部坐标)
- arrowprops 字典類型,可設定箭頭的屬性。
- facecolor 箭頭的顔色
- headwidth 箭頭的寬度
- width 箭尾的寬度
- shrink 收縮大小
- headlength 箭頭的長度
- arrowstyle 一些預設的箭頭樣式。當含有該參數時,上述4項參數将不再有效。
x = np.linspace(-10, 10, 100)
plt.plot(x, x ** 2, "-")
plt.title("抛物線圖")
# 在指定的坐标位置增加文字說明。
# plt.text(0.5,0, "這是極值點")
# plt.text與plt.figtext都可以進行文字說明,不同的是,text是基于坐标定位,而figtext是基于比例定位(左下角為原點)。
# plt.figtext(0.5, 0.5, "說明")
# plt.arrow(7, 20, -5.5, -15, width=1, head_width=4, head_length=4, color="r")
# plt.text(8, 25, "這是極值點")
# 使用text與arrow可以實作箭頭與文本的說明。我們可以使用plt.annotate可以将箭頭與說明文本一同繪制。
# plt.annotate("這是極值點", xy=(0, 0), xytext=(8, 25), arrowprops=dict(width=3, facecolor="g", headwidth=15, shrink=0.05, headlength=25))
plt.annotate("這是極值點", xy=(0, 0), xytext=(8, 25), arrowprops=dict(arrowstyle="<-"))
Text(8, 25, '這是極值點')
圖形類型
折線圖
plt.plot
# 适合于具有增長趨勢的資料表達
plt.plot(np.arange(1, 13), np.random.randint(50, 100, 12), "-o")
柱形圖 / 條形圖
plt.bar 柱形圖
plt.barh 條形圖
# 柱形圖/條形圖适合進行資料數值的對比(比較大小)。
# 繪制柱形圖
# plt.bar(["A公司", "B公司", "C公司"], [200, 100, 135])
# 繪制條形圖
plt.barh(["A公司", "B公司", "C公司"], [200, 100, 135])
<BarContainer object of 3 artists>
餅圖
plt.pie 餅圖
- labels 每個部分顯示的标簽。
- explode 指定每個部分距離圓心的偏移量(機關為半徑的長度)。
- colors 指定每個部分的顔色。
- autopct 設定每個部分顯示的比例值(格式化)。
- couterclock 是否逆時針繪圖。預設為True。
- startangle 初始繪圖點位置(逆時針偏移x軸的角度)。預設為偏移0度(x軸)。
- shadow 是否含有陰影,預設為False。
# 餅圖适合于進行比例的對比。(注意:使用餅圖時,參與對比的資料不宜過多。)
plt.pie([10, 30, 20, 50, 40], labels=["銷售1部", "銷售2部", "銷售3部", "技術1部", "技術2部"], explode=[0, 0, 0, 0, 0.2])
# plt.pie([10, 30, 20, 50, 40], labels=["銷售1部", "銷售2部", "銷售3部", "技術1部", "技術2部"], colors=["r", "g", "b", "y", "b"])
# plt.pie([10, 30, 20, 50, 40], labels=["銷售1部", "銷售2部", "銷售3部", "技術1部", "技術2部"],autopct="%.2f%%")
# plt.pie([10, 30, 20, 50, 40], labels=["銷售1部", "銷售2部", "銷售3部", "技術1部", "技術2部"],counterclock=False)
# plt.pie([10, 30, 20, 50, 40], labels=["銷售1部", "銷售2部", "銷售3部", "技術1部", "技術2部"], startangle=90)
# plt.pie([10, 30, 20, 50, 40], labels=["銷售1部", "銷售2部", "銷售3部", "技術1部", "技術2部"],shadow=True)
([<matplotlib.patches.Wedge at 0x1c9883cfc18>,
<matplotlib.patches.Wedge at 0x1c9883d91d0>,
<matplotlib.patches.Wedge at 0x1c9883d96a0>,
<matplotlib.patches.Wedge at 0x1c9883d9b70>,
<matplotlib.patches.Wedge at 0x1c9883e4080>],
[Text(1.075962358309037, 0.22870287165240302, '銷售1部'),
Text(0.5499999702695115, 0.9526279613277875, '銷售2部'),
Text(-0.5500000594609755, 0.9526279098330699, '銷售3部'),
Text(-1.004899951743044, -0.44741042342219545, '技術1部'),
Text(0.8698699721849806, -0.9660881075196512, '技術2部')])
散點圖 / 氣泡圖
散點圖适合于用來顯示與比較資料的分布狀态。
- marker 點的标記。
- s 點的大小。
- color 點的顔色。
說明:
- color與s參數可以統一設定,也可以為每一個點單獨設定。
# 散點圖/氣泡圖适合于表示資料的分布情況。
# 散點圖用來表示兩個次元的資料,如果資料次元超過2維,我們可以使用氣泡圖表示。【增加氣泡的大小,顔色,多表示兩個次元】
plt.scatter(np.random.randint(0, 100, 100), np.random.randint(0, 100, 100), marker="o", s = 30, c="g")
# plt.scatter([1, 5, 8], [8,2, 6], s=[30, 100, 60], c=["r", "g", "b"])
直方圖
直方圖(histogram)可以看成是一種特殊的柱形圖,用來将連續的資料頻率(數量)進行離散化顯示。在直方圖中,資料被分割成若幹區間,然後統計每個區間資料出現的頻率(數量)。
我們可以通過plt.hist來繪制直方圖。
-
- bins:設定分割區間的數量。
- normed:進行歸一化顯示。(機率密度)
-
# 直方圖适用于将連續型變量(多離散型)切分成離散型表示。 # x = np.random.randint(0, 101, 200) # 預設情況下,直方圖會劃分成10等分區間。 # 區間的劃分原則:左閉右開原則。(包含起始點,不包含終止點。)例外:最後一個區間,雙閉區間。(包含起始點,也包含終止點。) # plt.hist(x) # 如果需要自定義區間數量(等分數量:桶的數量),我們可以通過bins進行控制。 # plt.hist(x, bins=5) # bins參數,除了指定一個标量(區間桶的數量)之外,我們也可以傳遞一個數組。數組指定我們自定義劃分的界限。 # plt.hist(x, bins=[0, 10, 50, 100]) # 正态分布 x = np.random.randn(200) plt.hist(x, bins=8)
(array([ 6., 14., 17., 48., 51., 36., 19., 9.]), array([-2.89321226, -2.25176974, -1.61032721, -0.96888469, -0.32744217, 0.31400035, 0.95544287, 1.5968854 , 2.23832792]), <a list of 8 Patch objects>)
箱線圖
箱線圖也稱盒須圖。通過極值與Q1,Q2,Q3值來描述資料。
通過箱線圖,我們可以發現資料中的離群(異常)值。 箱線圖的離群點定義為:Q3+1.5IQR和Q1-1.5IQR。其中IQR為兩個四分位之間的距離。
# 使用箱線圖能夠友善我們進行離群點的檢測。(發現可能的異常值。) a = [2, 3, 5, 1, 4, 2, 6] # df = pd.DataFrame(a) # display(df) # df.describe() plt.boxplot([2, 3, 5, 1, 4, 2, 9])
{'whiskers': [<matplotlib.lines.Line2D at 0x1c986f57358>, <matplotlib.lines.Line2D at 0x1c986f576a0>], 'caps': [<matplotlib.lines.Line2D at 0x1c986f579e8>, <matplotlib.lines.Line2D at 0x1c986f57d30>], 'boxes': [<matplotlib.lines.Line2D at 0x1c988466ef0>], 'medians': [<matplotlib.lines.Line2D at 0x1c986f57e10>], 'fliers': [<matplotlib.lines.Line2D at 0x1c986f5b400>], 'means': []}
Series與DataFrame圖形繪制
Series與DataFrame類型的對象也支援圖形繪制,使用對象的plot方法即可。
如果我們需要繪制圖形的資料就存在Series或者DataFrame對象中,我們就可以直接繪制,而無需使用plt.plot。
其他類型圖形
plot預設繪制的是線形圖,我們可以通過調整其kind參數的值來繪制其他類型的圖形。- line:線形圖
- bar:柱形圖
- barh:條形圖
- hist:直方圖
- kde / density:核密度圖
- pie:餅圖
- box:箱線圖
- area:面積圖
- color
- alpha
- stacked:是否堆疊。
# s = pd.Series([1, 3, 8, 10, 12]) # s.plot(kind="line", marker="o", color="g") # s.plot.line() # s.plot(kind="bar") # s.plot(kind="barh") # s.plot.barh() # s.plot(kind="hist") # s.plot(kind="kde") # s.plot(kind="density") # s.plot(kind="pie") # s.plot(kind="box") # s.plot(kind="area", alpha=0.5) df = pd.DataFrame({"A":[10, 5, 8, 7], "B":[12, 11, 3, 6]}) display(df) # df.plot(kind="line") # 進行堆疊 # df.plot(kind="bar", stacked=True) # df.plot(kind="barh", stacked=True) # df.plot(kind="hist") # df.plot(kind="kde") # DataFrame在繪制餅圖的時候,需要指定y或subplots=True。 # y指定列索引。(要繪制哪一個列) # df.plot(kind="pie", y="B") # 如果DataFrame中的每個列都需要繪制餅圖,可以使用subplots=True,這樣,就可以将每個列在各自的子繪圖區域中繪制餅圖。 # df.plot(kind="pie", subplots=True) # 每個列繪制一個箱線圖。 # df.plot(kind="box") df.plot(kind="area")
轉載于:https://www.cnblogs.com/lqerio/p/11168667.html