本節內容轉自阿里天池技術論壇。詳細網址如下:https://tianchi.aliyun.com/learn/liveDetail.html?spm=5176.11510288.4851103.4.2706b7bd7jjU4d&classroomId=261 ,但是再好的博客,不如到權威官方文檔學習來的實在!博客從形式上教會人例化參數,傳入實參。而更深層次的學習,查看官方文檔更有用,這樣可以深入到源碼,產看到任何自己感性的源碼內容,更好的理論聯繫實際。在實戰中學習應用是掌握一門編碼語言,並激發編碼興趣的有效途徑。matplotlib官網爲: https://matplotlib.org/ ;另外Python3畫圖方面,個人感覺最好用的還是 Seaborn,其官網爲: 官網:http://seaborn.pydata.org/examples/index.html, 其中gallery或者Examples裏面都有非常好的例子,sklearn中也有部分非常好的例子,sklearn的API,Tutorial,User Guide都是非常好的參考!
目錄
Matplotlib數據可視化畫圖
- 基礎繪圖
- 圖表的基本元素
- 圖表樣式
- 圖表註解
- 子圖繪製
5.1 figure對象
5.2 建子圖後填充圖表
5.3 使用subplots子圖數組填充圖標
5.4 多系列圖繪製 - 基本圖表繪製
6.1 Series 與 DataFrame 繪圖
6.2 柱狀圖
6.3 面積圖
6.4 填圖
6.5 餅圖
6.6 直方圖
6.7 散點圖
6.7 箱型圖 - seaborn的熱圖
- 密度圖
主要內容
1.基礎繪圖
#!ls -l datalab/1742/*
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 圖表窗口1 → plt.show()
#1. 基礎繪圖
plt.plot(np.random.rand(10))
2. 圖表的基本元素
#2. 圖表的基本元素
"""
圖名
x軸標籤
y軸標籤
圖例
x軸邊界
y軸邊界
x刻度
y刻度
x刻度標籤
y刻度標籤
注意:範圍只限定圖表的長度,刻度則是決定顯示的標尺
(觀察下圖就可以得出二者之間的關係)
"""
df = pd.DataFrame(np.random.rand(10,2),columns=['A','B'])
fig = df.plot(figsize=(8,4)) # figsize:創建圖表窗口,設置窗口大小
plt.title('TITLETITLETITLE') # 圖名
plt.xlabel('X軸') # x軸標籤
plt.ylabel('Y軸') # y軸標籤
plt.legend(loc = 'upper right') # 顯示圖例,loc表示位置
plt.xlim([0,12]) # x軸邊界
plt.ylim([0,1.5]) # y軸邊界
plt.xticks(range(10)) # 設置x刻度
plt.yticks([0,0.2,0.4,0.6,0.8,1.0,1.2]) # 設置y刻度
fig.set_xticklabels("%.1f" %i for i in range(10)) # x軸刻度標籤
fig.set_yticklabels("%.2f" %i for i in [0,0.2,0.4,0.6,0.8,1.0,1.2]) # y軸刻度標籤
# 這裏x軸範圍是0-12,但刻度只是0-9,刻度標籤使得其顯示1位小數
3. 圖表樣式
"""
linestyle
color
marker
style (linestyle、marker、color)
alpha
colormap
grid
學習一個庫:官網是永遠的權威和參考出處
color參考:https://matplotlib.org/gallery/color/named_colors.html#sphx-glr-gallery-color-named-colors-py
"""
# 獨立設置
s = pd.Series(np.random.randn(100).cumsum())
s.plot(linestyle = '--',
marker = '.',
color="r",
grid=True)
# 直接用風格樣式設置
# 透明度與顏色版
# s.plot(style="--.",alpha = 0.8,colormap = 'Reds_r')
df = pd.DataFrame(np.random.randn(100, 4),columns=list('ABCD')).cumsum()
df.plot(style = '--.',alpha = 0.8,colormap = 'summer_r')
4. 圖表註解
df = pd.DataFrame(np.random.randn(10,2))
df.plot(style = '--o')
plt.text(5,0.5,'here',fontsize=12)
5. 子圖繪製
#plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=<class 'matplotlib.figure.Figure'>, **kwargs)
#plt.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)[source]
#5.1 figure對(不同框)
fig1 = plt.figure(num=1,figsize=(8,6))
plt.plot(np.random.rand(50).cumsum(),'k--')
fig2 = plt.figure(num=2,figsize=(8,6))
plt.plot(50-np.random.rand(50).cumsum(),'k--')
#np.cumsum()的理解
zhou=np.random.randint(0,50,10) #array()類型
shou=np.cumsum(zhou)
zhou1=np.random.randint(0,50,10).cumsum()
#5.2 建子圖後填充圖表
# 先建立子圖 然後填充圖表
fig = plt.figure(figsize=(10,6),facecolor = 'gray')
ax1 = fig.add_subplot(2,2,1)
plt.plot(np.random.rand(50).cumsum(),'k--')
plt.plot(np.random.randn(50).cumsum(),'b--')
ax2 = fig.add_subplot(2,2,2)
ax2.hist(np.random.rand(50),alpha=0.5)
ax4 = fig.add_subplot(2,2,4)
df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
ax4.plot(df2,alpha=0.5,linestyle='--',marker='.')
#5.3 使用subplots子圖數組填充圖標
# 創建一個新的figure,並返回一個subplot對象的numpy數組 → plt.subplot
fig,axes = plt.subplots(2,3,figsize=(10,4))
ts = pd.Series(np.random.randn(1000).cumsum())
print(axes, axes.shape, type(axes))
# 生成圖表對象的數組
ax1 = axes[0,1]
ax1.plot(ts)
## plt.subplots 參數調整
fig,axes = plt.subplots(2,2,sharex=True,sharey=True)
# sharex,sharey:是否共享x,y刻度
for i in range(2):
for j in range(2):
axes[i,j].hist(np.random.randn(500),color='b',alpha=0.5)
# wspace,hspace:用於控制寬度和高度的百分比,比如subplot之間的間距
plt.subplots_adjust(wspace=0,hspace=0)
#5.4 多系列圖繪製
#plt.plot():
#subplots,是否分別繪製系列(子圖)
#layout:繪製子圖矩陣,按順序填充
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))
df = df.cumsum()
df.plot(style = '--.',alpha = 0.4,grid = True,figsize = (20,8),
subplots = True,
layout = (1,4),
sharex = False)
plt.subplots_adjust(wspace=0,hspace=0.2)
6. 基本圖表繪製
#6.1 Series 與 DataFrame 繪圖
"""
plt.plot(kind='line', ax=None, figsize=None, use_index=True, title=None, grid=None, legend=False,
style=None, logx=False, logy=False, loglog=False, xticks=None, yticks=None, xlim=None, ylim=None,
rot=None, fontsize=None, colormap=None, table=False, yerr=None, xerr=None, label=None, secondary_y=False, **kwds)
參數含義:
series的index爲橫座標
value爲縱座標
kind → line,bar,barh...(折線圖,柱狀圖,柱狀圖-橫...)
label → 圖例標籤,Dataframe格式以列名爲label
style → 風格字符串,這裏包括了linestyle(-),marker(.),color(g)
color → 顏色,有color指定時候,以color顏色爲準
alpha → 透明度,0-1
use_index → 將索引用爲刻度標籤,默認爲True
rot → 旋轉刻度標籤,0-360
grid → 顯示網格,一般直接用plt.grid
xlim,ylim → x,y軸界限
xticks,yticks → x,y軸刻度值
figsize → 圖像大小
title → 圖名
legend → 是否顯示圖例,一般直接用plt.legend()
"""
#添加中文支持
from matplotlib.font_manager import FontProperties
#就在我自己的C盤的這個目錄下面
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) # pandas 時間序列
ts = ts.cumsum()
ts.plot(kind='line',
label = "what",
style = '--.',
color = 'g',
alpha = 0.4,
use_index = True,
rot = 45,
grid = True,
ylim = [-50,50],
yticks = list(range(-50,50,10)),
figsize = (8,4),
title = 'wenqing',
legend = True)
plt.title(u'文青', fontproperties=font)
# 對網格項進行更加細緻的設置
#plt.grid(True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'x') # 網格
plt.legend()
# subplots → 是否將各個列繪製到不同圖表,默認False
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD')).cumsum()
df.plot(kind='line',
style = '--.',
alpha = 0.4,
use_index = True,
rot = 45,
grid = True,
figsize = (8,4),
title = 'test',
legend = True,
subplots = False,
colormap = 'Greens')
#6.2 柱狀圖
#plt.plot(kind='bar/barh')
# 創建一個新的figure,並返回一個subplot對象的numpy數組
fig,axes = plt.subplots(4,1,figsize = (10,10))
s = pd.Series(np.random.randint(0,10,16),index = list('abcdefghijklmnop'))
df = pd.DataFrame(np.random.rand(10,3), columns=['a','b','c'])
# 單系列柱狀圖方法一:plt.plot(kind='bar/barh')
s.plot(kind='bar',color = 'b',grid = True,alpha = 0.5,ax = axes[0]) # ax參數 → 選擇第幾個子圖
# 多系列柱狀圖
df = pd.DataFrame(np.random.rand(10,3), columns=['a','b','c'])
df.plot(kind='bar',ax = axes[1],grid = True,colormap='Reds_r')
# 多系列堆疊圖
# stacked → 堆疊
df.plot(kind='bar',ax = axes[2],grid = True,colormap='Blues_r',stacked=True)
"""
plt.bar()
x,y參數:x,y值
width:寬度比例
facecolor柱狀圖裏填充的顏色、edgecolor是邊框的顏色
left-每個柱x軸左邊界,bottom-每個柱y軸下邊界 → bottom擴展即可化爲甘特圖 Gantt Chart
align:決定整個bar圖分佈,默認left表示默認從左邊界開始繪製,center會將圖繪製在中間位置
xerr/yerr :x/y方向error bar
"""
plt.figure(figsize=(10,4))
x = np.arange(10)
y1 = np.random.rand(10)
y2 = -np.random.rand(10)
plt.bar(x,y1,width = 1,facecolor = 'yellowgreen',edgecolor = 'white',yerr = y1*0.1)
plt.bar(x,y2,width = 1,facecolor = 'lightskyblue',edgecolor = 'white',yerr = y2*0.1)
for i,j in zip(x,y1):
plt.text(i-0.2,j-0.15,'%.2f' % j, color = 'k')
for i,j in zip(x,y2):
plt.text(i-0.2,j+0.05,'%.2f' % -j, color = 'k')
# 給圖添加text
# zip() 函數用於將可迭代的對象作爲參數,將對象中對應的元素打包成一個個元組,然後返回由這些元組組成的列表。
#6.3 面積圖
"""
stacked:是否堆疊,默認情況下,區域圖被堆疊
爲了產生堆積面積圖,每列必須是正值或全部負值!
當數據有NaN時候,自動填充0,圖標籤需要清洗掉缺失值
"""
fig,axes = plt.subplots(2,1,figsize = (8,6))
df1 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame(np.random.randn(10, 4), columns=['a', 'b', 'c', 'd'])
df1.plot.area(colormap = 'Greens_r',alpha = 0.5,ax = axes[0])
df2.plot.area(stacked=False,colormap = 'Set2',alpha = 0.5,ax = axes[1])
#6.4 填圖
fig,axes = plt.subplots(2,1,figsize = (8,6))
x = np.linspace(0, 1, 500)
y1 = np.sin(4 * np.pi * x) * np.exp(-5 * x)
y2 = -np.sin(4 * np.pi * x) * np.exp(-5 * x)
axes[0].fill(x, y1, 'r',alpha=0.5,label='y1')
axes[0].fill(x, y2, 'g',alpha=0.5,label='y2')
# 對函數與座標軸之間的區域進行填充,使用fill函數
# 也可寫成:plt.fill(x, y1, 'r',x, y2, 'g',alpha=0.5)
x = np.linspace(0, 5 * np.pi, 1000)
y1 = np.sin(x)
y2 = np.sin(2 * x)
axes[1].fill_between(x, y1, y2, color ='b',alpha=0.5,label='area')
# 填充兩個函數之間的區域,使用fill_between函數
for i in range(2):
axes[i].legend()
axes[i].grid()
# 添加圖例、格網
#6.5 餅圖
"""
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, hold=None, data=None)
參數含義:
第一個參數:數據
explode:指定每部分的偏移量
labels:標籤
colors:顏色
autopct:餅圖上的數據標籤顯示方式
pctdistance:每個餅切片的中心和通過autopct生成的文本開始之間的比例
labeldistance:被畫餅標記的直徑,默認值:1.1
shadow:陰影
startangle:開始角度
radius:半徑
frame:圖框
counterclock:指定指針方向,順時針或者逆時針
"""
s = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series')
plt.axis('equal') # 保證長寬相等
plt.pie(s,
explode = [0.1,0,0,0],
labels = s.index,
colors=['r', 'g', 'b', 'c'],
autopct='%.2f%%',
pctdistance=0.6,
labeldistance = 1.2,
shadow = True,
startangle=0,
radius=1.5,
frame=False)
#6.6 直方圖
"""
plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None,
histtype='bar', align='mid', orientation='vertical',rwidth=None, log=False, color=None, label=None,
stacked=False, hold=None, data=None, **kwargs)
bin:箱子的寬度
normed 標準化
histtype 風格,bar,barstacked,step,stepfilled
orientation 水平還是垂直{‘horizontal’, ‘vertical’}
align : {‘left’, ‘mid’, ‘right’}, optional(對齊方式)
stacked:是否堆疊
"""
# 直方圖
s = pd.Series(np.random.randn(1000))
s.hist(bins = 20,
histtype = 'bar',
align = 'mid',
orientation = 'vertical',
alpha=0.5,
normed =True)
# 密度圖
s.plot(kind='kde',style='k--')
# 堆疊直方圖
plt.figure(num=1)
df = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),
'c': np.random.randn(1000) - 1, 'd': np.random.randn(1000)-2},
columns=['a', 'b', 'c','d'])
df.plot.hist(stacked=True,
bins=20,
colormap='Greens_r',
alpha=0.5,
grid=True)
# 使用DataFrame.plot.hist()和Series.plot.hist()方法繪製
df.hist(bins=50)
# 生成多個直方圖
#6.7 散點圖
"""
plt.scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None,
verts=None, edgecolors=None, hold=None, data=None, **kwargs)
參數含義:
s:散點的大小
c:散點的顏色
vmin,vmax:亮度設置,標量
cmap:colormap
"""
plt.figure(figsize=(8,6))
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.scatter(x,y,marker='.',
s = np.random.randn(1000)*100,
cmap = 'Reds_r',
c = y,
alpha = 0.8,)
plt.grid()
# pd.scatter_matrix()散點矩陣
# pd.scatter_matrix(frame, alpha=0.5, figsize=None, ax=None,
# grid=False, diagonal='hist', marker='.', density_kwds=None, hist_kwds=None, range_padding=0.05, **kwds)
# diagonal:({‘hist’, ‘kde’}),必須且只能在{‘hist’, ‘kde’}中選擇1個 → 每個指標的頻率圖
# range_padding:(float, 可選),圖像在x軸、y軸原點附近的留白(padding),該值越大,留白距離越大,圖像遠離座標原點
df = pd.DataFrame(np.random.randn(100,4),columns = ['a','b','c','d'])
pd.scatter_matrix(df,figsize=(10,6),
marker = 'o',
diagonal='kde',
alpha = 0.5,
range_padding=0.5)
#6.7 箱型圖¶
'''
箱型圖:又稱爲盒須圖、盒式圖、盒狀圖或箱線圖,是一種用作顯示一組數據分散情況資料的統計圖
包含一組數據的:最大值、最小值、中位數、上四分位數(Q1)、下四分位數(Q3)、異常值
① 中位數 → 一組數據平均分成兩份,中間的數
② 下四分位數Q1 → 是將序列平均分成四份,計算(n+1)/4與(n-1)/4兩種,一般使用(n+1)/4
③ 上四分位數Q3 → 是將序列平均分成四份,計算(1+n)/4*3=6.75
④ 內限 → T形的盒須就是內限,最大值區間Q3+1.5IQR,最小值區間Q1-1.5IQR (IQR=Q3-Q1)
⑤ 外限 → T形的盒須就是內限,最大值區間Q3+3IQR,最小值區間Q1-3IQR (IQR=Q3-Q1)
⑥ 異常值 → 內限之外 - 中度異常,外限之外 - 極度異常
plt.plot.box(),plt.boxplot()
'''
# plt.plot.box()繪製
fig,axes = plt.subplots(2,1,figsize=(10,6))
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
# 箱型圖着色
# boxes → 箱線
# whiskers → 分位數與error bar橫線之間豎線的顏色
# medians → 中位數線顏色
# caps → error bar橫線顏色
df.plot.box(ylim=[0,1.2],
grid = True,
color = color,
ax = axes[0])
df.plot.box(vert=False,
positions=[1, 4, 5, 6, 8],
ax = axes[1],
grid = True,
color = color)
# vert:是否垂直,默認True
# position:箱型圖佔位
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
plt.figure(figsize=(10,4))
# 創建圖表、數據
f = df.boxplot(sym = 'o', # 異常點形狀,參考marker
vert = True, # 是否垂直
whis = 1.5, # IQR,默認1.5,也可以設置區間比如[5,95],代表強制上下邊緣爲數據95%和5%位置
patch_artist = True, # 上下四分位框內是否填充,True爲填充
meanline = False,showmeans=True, # 是否有均值線及其形狀
showbox = True, # 是否顯示箱線
showcaps = True, # 是否顯示邊緣線
showfliers = True, # 是否顯示異常值
notch = False, # 中間箱體是否缺口
return_type='dict' # 返回類型爲字典
)
plt.title('boxplot')
for box in f['boxes']:
box.set( color='b', linewidth=1) # 箱體邊框顏色
box.set( facecolor = 'b' ,alpha=0.5) # 箱體內部填充顏色
for whisker in f['whiskers']:
whisker.set(color='k', linewidth=0.5,linestyle='-')
for cap in f['caps']:
cap.set(color='gray', linewidth=2)
for median in f['medians']:
median.set(color='DarkBlue', linewidth=2)
for flier in f['fliers']:
flier.set(marker='o', color='y', alpha=0.5)
# boxes, 箱線
# medians, 中位值的橫線,
# whiskers, 從box到error bar之間的豎線.
# fliers, 異常值
# caps, error bar橫線
# means, 均值的橫線,
# plt.boxplot()繪製
# 分組彙總
df = pd.DataFrame(np.random.rand(10,2), columns=['Col1', 'Col2'] )
df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])
df['Y'] = pd.Series(['A','B','A','B','A','B','A','B','A','B'])
df.boxplot(by = 'X')
df.boxplot(column=['Col1','Col2'], by=['X','Y'])
# columns:按照數據的列分子圖
# by:按照列分組做箱型圖
彙總代碼
# -*- coding: utf-8 -*-
"""Matplotlib數據可視化畫圖"""
#!ls -l datalab/1742/*
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 圖表窗口1 → plt.show()
#1. 基礎繪圖
plt.plot(np.random.rand(10))
#2. 圖表的基本元素
"""
圖名
x軸標籤
y軸標籤
圖例
x軸邊界
y軸邊界
x刻度
y刻度
x刻度標籤
y刻度標籤
注意:範圍只限定圖表的長度,刻度則是決定顯示的標尺
(觀察下圖就可以得出二者之間的關係)
"""
df = pd.DataFrame(np.random.rand(10,2),columns=['A','B'])
fig = df.plot(figsize=(8,4)) # figsize:創建圖表窗口,設置窗口大小
plt.title('TITLETITLETITLE') # 圖名
plt.xlabel('X軸') # x軸標籤
plt.ylabel('Y軸') # y軸標籤
plt.legend(loc = 'upper right') # 顯示圖例,loc表示位置
plt.xlim([0,12]) # x軸邊界
plt.ylim([0,1.5]) # y軸邊界
plt.xticks(range(10)) # 設置x刻度
plt.yticks([0,0.2,0.4,0.6,0.8,1.0,1.2]) # 設置y刻度
fig.set_xticklabels("%.1f" %i for i in range(10)) # x軸刻度標籤
fig.set_yticklabels("%.2f" %i for i in [0,0.2,0.4,0.6,0.8,1.0,1.2]) # y軸刻度標籤
# 這裏x軸範圍是0-12,但刻度只是0-9,刻度標籤使得其顯示1位小數
#3. 圖表樣式
"""
linestyle
color
marker
style (linestyle、marker、color)
alpha
colormap
grid
學習一個庫:官網是永遠的權威和參考出處
color參考:https://matplotlib.org/gallery/color/named_colors.html#sphx-glr-gallery-color-named-colors-py
"""
# 獨立設置
s = pd.Series(np.random.randn(100).cumsum())
s.plot(linestyle = '--',
marker = '.',
color="r",
grid=True)
# 直接用風格樣式設置
# 透明度與顏色版
# s.plot(style="--.",alpha = 0.8,colormap = 'Reds_r')
df = pd.DataFrame(np.random.randn(100, 4),columns=list('ABCD')).cumsum()
df.plot(style = '--.',alpha = 0.8,colormap = 'summer_r')
#4. 圖表註解
df = pd.DataFrame(np.random.randn(10,2))
df.plot(style = '--o')
plt.text(5,0.5,'here',fontsize=12)
#5. 子圖繪製
#plt.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True, FigureClass=<class 'matplotlib.figure.Figure'>, **kwargs)
#plt.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)[source]
#5.1 figure對(不同框)
fig1 = plt.figure(num=1,figsize=(8,6))
plt.plot(np.random.rand(50).cumsum(),'k--')
fig2 = plt.figure(num=2,figsize=(8,6))
plt.plot(50-np.random.rand(50).cumsum(),'k--')
#np.cumsum()的理解
zhou=np.random.randint(0,50,10) #array()類型
shou=np.cumsum(zhou)
zhou1=np.random.randint(0,50,10).cumsum()
#5.2 建子圖後填充圖表
# 先建立子圖 然後填充圖表
fig = plt.figure(figsize=(10,6),facecolor = 'gray')
ax1 = fig.add_subplot(2,2,1)
plt.plot(np.random.rand(50).cumsum(),'k--')
plt.plot(np.random.randn(50).cumsum(),'b--')
ax2 = fig.add_subplot(2,2,2)
ax2.hist(np.random.rand(50),alpha=0.5)
ax4 = fig.add_subplot(2,2,4)
df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
ax4.plot(df2,alpha=0.5,linestyle='--',marker='.')
#5.3 使用subplots子圖數組填充圖標
# 創建一個新的figure,並返回一個subplot對象的numpy數組 → plt.subplot
fig,axes = plt.subplots(2,3,figsize=(10,4))
ts = pd.Series(np.random.randn(1000).cumsum())
print(axes, axes.shape, type(axes))
# 生成圖表對象的數組
ax1 = axes[0,1]
ax1.plot(ts)
## plt.subplots 參數調整
fig,axes = plt.subplots(2,2,sharex=True,sharey=True)
# sharex,sharey:是否共享x,y刻度
for i in range(2):
for j in range(2):
axes[i,j].hist(np.random.randn(500),color='b',alpha=0.5)
# wspace,hspace:用於控制寬度和高度的百分比,比如subplot之間的間距
plt.subplots_adjust(wspace=0,hspace=0)
#5.4 多系列圖繪製
#plt.plot():
#subplots,是否分別繪製系列(子圖)
#layout:繪製子圖矩陣,按順序填充
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD'))
df = df.cumsum()
df.plot(style = '--.',alpha = 0.4,grid = True,figsize = (20,8),
subplots = True,
layout = (1,4),
sharex = False)
plt.subplots_adjust(wspace=0,hspace=0.2)
#6. 基本圖表繪製
#6.1 Series 與 DataFrame 繪圖
"""
plt.plot(kind='line', ax=None, figsize=None, use_index=True, title=None, grid=None, legend=False,
style=None, logx=False, logy=False, loglog=False, xticks=None, yticks=None, xlim=None, ylim=None,
rot=None, fontsize=None, colormap=None, table=False, yerr=None, xerr=None, label=None, secondary_y=False, **kwds)
參數含義:
series的index爲橫座標
value爲縱座標
kind → line,bar,barh...(折線圖,柱狀圖,柱狀圖-橫...)
label → 圖例標籤,Dataframe格式以列名爲label
style → 風格字符串,這裏包括了linestyle(-),marker(.),color(g)
color → 顏色,有color指定時候,以color顏色爲準
alpha → 透明度,0-1
use_index → 將索引用爲刻度標籤,默認爲True
rot → 旋轉刻度標籤,0-360
grid → 顯示網格,一般直接用plt.grid
xlim,ylim → x,y軸界限
xticks,yticks → x,y軸刻度值
figsize → 圖像大小
title → 圖名
legend → 是否顯示圖例,一般直接用plt.legend()
"""
#添加中文支持
from matplotlib.font_manager import FontProperties
#就在我自己的C盤的這個目錄下面
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) # pandas 時間序列
ts = ts.cumsum()
ts.plot(kind='line',
label = "what",
style = '--.',
color = 'g',
alpha = 0.4,
use_index = True,
rot = 45,
grid = True,
ylim = [-50,50],
yticks = list(range(-50,50,10)),
figsize = (8,4),
title = 'wenqing',
legend = True)
plt.title(u'文青', fontproperties=font)
# 對網格項進行更加細緻的設置
#plt.grid(True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'x') # 網格
plt.legend()
# subplots → 是否將各個列繪製到不同圖表,默認False
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list('ABCD')).cumsum()
df.plot(kind='line',
style = '--.',
alpha = 0.4,
use_index = True,
rot = 45,
grid = True,
figsize = (8,4),
title = 'test',
legend = True,
subplots = False,
colormap = 'Greens')
#6.2 柱狀圖
#plt.plot(kind='bar/barh')
# 創建一個新的figure,並返回一個subplot對象的numpy數組
fig,axes = plt.subplots(4,1,figsize = (10,10))
s = pd.Series(np.random.randint(0,10,16),index = list('abcdefghijklmnop'))
df = pd.DataFrame(np.random.rand(10,3), columns=['a','b','c'])
# 單系列柱狀圖方法一:plt.plot(kind='bar/barh')
s.plot(kind='bar',color = 'b',grid = True,alpha = 0.5,ax = axes[0]) # ax參數 → 選擇第幾個子圖
# 多系列柱狀圖
df = pd.DataFrame(np.random.rand(10,3), columns=['a','b','c'])
df.plot(kind='bar',ax = axes[1],grid = True,colormap='Reds_r')
# 多系列堆疊圖
# stacked → 堆疊
df.plot(kind='bar',ax = axes[2],grid = True,colormap='Blues_r',stacked=True)
"""
plt.bar()
x,y參數:x,y值
width:寬度比例
facecolor柱狀圖裏填充的顏色、edgecolor是邊框的顏色
left-每個柱x軸左邊界,bottom-每個柱y軸下邊界 → bottom擴展即可化爲甘特圖 Gantt Chart
align:決定整個bar圖分佈,默認left表示默認從左邊界開始繪製,center會將圖繪製在中間位置
xerr/yerr :x/y方向error bar
"""
plt.figure(figsize=(10,4))
x = np.arange(10)
y1 = np.random.rand(10)
y2 = -np.random.rand(10)
plt.bar(x,y1,width = 1,facecolor = 'yellowgreen',edgecolor = 'white',yerr = y1*0.1)
plt.bar(x,y2,width = 1,facecolor = 'lightskyblue',edgecolor = 'white',yerr = y2*0.1)
for i,j in zip(x,y1):
plt.text(i-0.2,j-0.15,'%.2f' % j, color = 'k')
for i,j in zip(x,y2):
plt.text(i-0.2,j+0.05,'%.2f' % -j, color = 'k')
# 給圖添加text
# zip() 函數用於將可迭代的對象作爲參數,將對象中對應的元素打包成一個個元組,然後返回由這些元組組成的列表。
#6.3 面積圖
"""
stacked:是否堆疊,默認情況下,區域圖被堆疊
爲了產生堆積面積圖,每列必須是正值或全部負值!
當數據有NaN時候,自動填充0,圖標籤需要清洗掉缺失值
"""
fig,axes = plt.subplots(2,1,figsize = (8,6))
df1 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame(np.random.randn(10, 4), columns=['a', 'b', 'c', 'd'])
df1.plot.area(colormap = 'Greens_r',alpha = 0.5,ax = axes[0])
df2.plot.area(stacked=False,colormap = 'Set2',alpha = 0.5,ax = axes[1])
#6.4 填圖
fig,axes = plt.subplots(2,1,figsize = (8,6))
x = np.linspace(0, 1, 500)
y1 = np.sin(4 * np.pi * x) * np.exp(-5 * x)
y2 = -np.sin(4 * np.pi * x) * np.exp(-5 * x)
axes[0].fill(x, y1, 'r',alpha=0.5,label='y1')
axes[0].fill(x, y2, 'g',alpha=0.5,label='y2')
# 對函數與座標軸之間的區域進行填充,使用fill函數
# 也可寫成:plt.fill(x, y1, 'r',x, y2, 'g',alpha=0.5)
x = np.linspace(0, 5 * np.pi, 1000)
y1 = np.sin(x)
y2 = np.sin(2 * x)
axes[1].fill_between(x, y1, y2, color ='b',alpha=0.5,label='area')
# 填充兩個函數之間的區域,使用fill_between函數
for i in range(2):
axes[i].legend()
axes[i].grid()
# 添加圖例、格網
#6.5 餅圖
"""
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, hold=None, data=None)
參數含義:
第一個參數:數據
explode:指定每部分的偏移量
labels:標籤
colors:顏色
autopct:餅圖上的數據標籤顯示方式
pctdistance:每個餅切片的中心和通過autopct生成的文本開始之間的比例
labeldistance:被畫餅標記的直徑,默認值:1.1
shadow:陰影
startangle:開始角度
radius:半徑
frame:圖框
counterclock:指定指針方向,順時針或者逆時針
"""
s = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series')
plt.axis('equal') # 保證長寬相等
plt.pie(s,
explode = [0.1,0,0,0],
labels = s.index,
colors=['r', 'g', 'b', 'c'],
autopct='%.2f%%',
pctdistance=0.6,
labeldistance = 1.2,
shadow = True,
startangle=0,
radius=1.5,
frame=False)
#6.6 直方圖
"""
plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None,
histtype='bar', align='mid', orientation='vertical',rwidth=None, log=False, color=None, label=None,
stacked=False, hold=None, data=None, **kwargs)
bin:箱子的寬度
normed 標準化
histtype 風格,bar,barstacked,step,stepfilled
orientation 水平還是垂直{‘horizontal’, ‘vertical’}
align : {‘left’, ‘mid’, ‘right’}, optional(對齊方式)
stacked:是否堆疊
"""
# 直方圖
s = pd.Series(np.random.randn(1000))
s.hist(bins = 20,
histtype = 'bar',
align = 'mid',
orientation = 'vertical',
alpha=0.5,
normed =True)
# 密度圖
s.plot(kind='kde',style='k--')
# 堆疊直方圖
plt.figure(num=1)
df = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),
'c': np.random.randn(1000) - 1, 'd': np.random.randn(1000)-2},
columns=['a', 'b', 'c','d'])
df.plot.hist(stacked=True,
bins=20,
colormap='Greens_r',
alpha=0.5,
grid=True)
# 使用DataFrame.plot.hist()和Series.plot.hist()方法繪製
df.hist(bins=50)
# 生成多個直方圖
#6.7 散點圖
"""
plt.scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None,
verts=None, edgecolors=None, hold=None, data=None, **kwargs)
參數含義:
s:散點的大小
c:散點的顏色
vmin,vmax:亮度設置,標量
cmap:colormap
"""
plt.figure(figsize=(8,6))
x = np.random.randn(1000)
y = np.random.randn(1000)
plt.scatter(x,y,marker='.',
s = np.random.randn(1000)*100,
cmap = 'Reds_r',
c = y,
alpha = 0.8,)
plt.grid()
# pd.scatter_matrix()散點矩陣
# pd.scatter_matrix(frame, alpha=0.5, figsize=None, ax=None,
# grid=False, diagonal='hist', marker='.', density_kwds=None, hist_kwds=None, range_padding=0.05, **kwds)
# diagonal:({‘hist’, ‘kde’}),必須且只能在{‘hist’, ‘kde’}中選擇1個 → 每個指標的頻率圖
# range_padding:(float, 可選),圖像在x軸、y軸原點附近的留白(padding),該值越大,留白距離越大,圖像遠離座標原點
df = pd.DataFrame(np.random.randn(100,4),columns = ['a','b','c','d'])
pd.scatter_matrix(df,figsize=(10,6),
marker = 'o',
diagonal='kde',
alpha = 0.5,
range_padding=0.5)
#6.7 箱型圖¶
'''
箱型圖:又稱爲盒須圖、盒式圖、盒狀圖或箱線圖,是一種用作顯示一組數據分散情況資料的統計圖
包含一組數據的:最大值、最小值、中位數、上四分位數(Q1)、下四分位數(Q3)、異常值
① 中位數 → 一組數據平均分成兩份,中間的數
② 下四分位數Q1 → 是將序列平均分成四份,計算(n+1)/4與(n-1)/4兩種,一般使用(n+1)/4
③ 上四分位數Q3 → 是將序列平均分成四份,計算(1+n)/4*3=6.75
④ 內限 → T形的盒須就是內限,最大值區間Q3+1.5IQR,最小值區間Q1-1.5IQR (IQR=Q3-Q1)
⑤ 外限 → T形的盒須就是內限,最大值區間Q3+3IQR,最小值區間Q1-3IQR (IQR=Q3-Q1)
⑥ 異常值 → 內限之外 - 中度異常,外限之外 - 極度異常
plt.plot.box(),plt.boxplot()
'''
# plt.plot.box()繪製
fig,axes = plt.subplots(2,1,figsize=(10,6))
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
# 箱型圖着色
# boxes → 箱線
# whiskers → 分位數與error bar橫線之間豎線的顏色
# medians → 中位數線顏色
# caps → error bar橫線顏色
df.plot.box(ylim=[0,1.2],
grid = True,
color = color,
ax = axes[0])
df.plot.box(vert=False,
positions=[1, 4, 5, 6, 8],
ax = axes[1],
grid = True,
color = color)
# vert:是否垂直,默認True
# position:箱型圖佔位
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
plt.figure(figsize=(10,4))
# 創建圖表、數據
f = df.boxplot(sym = 'o', # 異常點形狀,參考marker
vert = True, # 是否垂直
whis = 1.5, # IQR,默認1.5,也可以設置區間比如[5,95],代表強制上下邊緣爲數據95%和5%位置
patch_artist = True, # 上下四分位框內是否填充,True爲填充
meanline = False,showmeans=True, # 是否有均值線及其形狀
showbox = True, # 是否顯示箱線
showcaps = True, # 是否顯示邊緣線
showfliers = True, # 是否顯示異常值
notch = False, # 中間箱體是否缺口
return_type='dict' # 返回類型爲字典
)
plt.title('boxplot')
for box in f['boxes']:
box.set( color='b', linewidth=1) # 箱體邊框顏色
box.set( facecolor = 'b' ,alpha=0.5) # 箱體內部填充顏色
for whisker in f['whiskers']:
whisker.set(color='k', linewidth=0.5,linestyle='-')
for cap in f['caps']:
cap.set(color='gray', linewidth=2)
for median in f['medians']:
median.set(color='DarkBlue', linewidth=2)
for flier in f['fliers']:
flier.set(marker='o', color='y', alpha=0.5)
# boxes, 箱線
# medians, 中位值的橫線,
# whiskers, 從box到error bar之間的豎線.
# fliers, 異常值
# caps, error bar橫線
# means, 均值的橫線,
# plt.boxplot()繪製
# 分組彙總
df = pd.DataFrame(np.random.rand(10,2), columns=['Col1', 'Col2'] )
df['X'] = pd.Series(['A','A','A','A','A','B','B','B','B','B'])
df['Y'] = pd.Series(['A','B','A','B','A','B','A','B','A','B'])
df.boxplot(by = 'X')
df.boxplot(column=['Col1','Col2'], by=['X','Y'])
# columns:按照數據的列分子圖
# by:按照列分組做箱型圖
7.seaborn的熱圖
# 熱圖 - heatmap()
# 簡單示例
import seaborn as sns
df = pd.DataFrame(np.random.rand(10,15))
# 創建數據 - 10*12圖表
sns.heatmap(df, # 加載數據
vmin=0, vmax=1 # 設置圖例最大最小值
)
#1.熱圖
# heatmap()
# 參數設置
flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")
#print(flights.head())
# 加載數據
sns.heatmap(flights,
annot = True, # 是否顯示數值
fmt = 'd', # 格式化字符串
linewidths = 0.2, # 格子邊線寬度
#center = 100, # 調色盤的色彩中心值,若沒有指定,則以cmap爲主
#cmap = 'Reds', # 設置調色盤
cbar = True, # 是否顯示圖例色帶
#cbar_kws={"orientation": "horizontal"}, # 是否橫向顯示圖例色帶
#square = True, # 是否正方形顯示圖表
)
# heatmap()
#2.繪製半邊熱圖
sns.set(style="white")
# 設置風格
rs = np.random.RandomState(33)
d = pd.DataFrame(rs.normal(size=(100, 26)))
corr = d.corr() # 求解相關性矩陣表格
# 創建數據
mask = np.zeros_like(corr, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
# 設置一個“上三角形”蒙版
cmap = sns.diverging_palette(220, 10, as_cmap=True)
# 設置調色盤
sns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,
square=True, linewidths=0.2)
#生成半邊熱圖
attend = sns.load_dataset("attention")
print(attend.head())
# 加載數據
g = sns.FacetGrid(attend, col="subject", col_wrap=5, # 設置每行的圖表數量
size=1.5) ##取定subject列,看第五列score的走勢,可以用於產看兩個變量的相關性走勢
g.map(plt.plot, "solutions", "score",
marker="o",color = 'gray',linewidth = 2)
# 繪製圖表矩陣
g.set(xlim = (0,4),
ylim = (0,10),
xticks = [0,1,2,3,4],
yticks = [0,2,4,6,8,10]
)
# 設置x,y軸刻度
#3.時間線圖
# tsplot()
# 參數設置
attend = sns.load_dataset("attention")
columns=attend.columns.tolist()
print(attend.head())
print('數據量爲:%i條' % len(attend))
print('timepoint爲0.0時的數據量爲:%i條' % len(attend[attend['solutions'] == 0]))
print('timepoint共有%i個唯一值' % len(attend['solutions'].value_counts()))
#print(gammas['timepoint'].value_counts()) # 查看唯一值具體信息
# 導入數據
sns.tsplot(time="solutions", # 時間數據,x軸
value="score", # y軸value
unit="subject", #
condition="attention", # 分類
data=attend)
8.密度圖
rs = np.random.RandomState(2) # 設定隨機數種子
df = pd.DataFrame(rs.randn(100,2),
columns = ['A','B'])
sns.kdeplot(df['A'],df['B'],
cbar = True, # 是否顯示顏色圖例
shade = True, # 是否填充
cmap = 'Reds', # 設置調色盤
shade_lowest=False, # 最外圍顏色是否顯示
n_levels = 10 # 曲線個數(如果非常多,則會越平滑)
)
# 兩個維度數據生成曲線密度圖,以顏色作爲密度衰減顯示
sns.rugplot(df['A'], color="g", axis='x',alpha = 0.5)
sns.rugplot(df['B'], color="r", axis='y',alpha = 0.5)
# 注意設置x,y軸
# 密度圖 - kdeplot()
# 兩個樣本數據密度分佈圖
# 多個密度圖
rs1 = np.random.RandomState(2)
rs2 = np.random.RandomState(5)
df1 = pd.DataFrame(rs1.randn(100,2)+2,columns = ['A','B'])
df2 = pd.DataFrame(rs2.randn(100,2)-2,columns = ['A','B'])
# 創建數據
sns.kdeplot(df1['A'],df1['B'],cmap = 'Greens',
shade = True,shade_lowest=False)
sns.kdeplot(df2['A'],df2['B'],cmap = 'Blues',
shade = True,shade_lowest=False)
# 創建圖表
#sns.rugplot(df2['A']+df1['A'], color="g", axis='x',alpha = 0.5)
#sns.rugplot(df2['B']+df1['B'], color="r", axis='y',alpha = 0.5)
# 矩陣散點圖 - pairplot()
sns.set_style("white")
# 設置風格
iris = sns.load_dataset("iris")
print(iris.head())
# 讀取數據
sns.pairplot(iris,
kind = 'scatter', # 散點圖/迴歸分佈圖 {‘scatter’, ‘reg’}
diag_kind="hist", # 直方圖/密度圖 {‘hist’, ‘kde’}
hue="species", # 按照某一字段進行分類
palette="husl", # 設置調色板
markers=["o", "s", "D"], # 設置不同系列的點樣式(這裏根據參考分類個數)
size = 2, # 圖表大小
)