Python-Matplotlib、Seaborn、Plotly


Catalog:Click to jump to the corresponding position

一、繪圖參數詳解

二、折線圖

三、餅圖

四、條形圖

五、直方圖

六、散點圖

七、堆積條形圖

八、箱線圖

九、圖形的完整設置

  9.1圖例

  9.2圖像大小

  9.3繪制網格線

  9.4繪制參考線

  9.5繪制參考區域

  9.6畫布的使用

  9.7調整刻度軸

  9.8圖形添加文本內容

十、繪制雙坐標軸

十一、多個圖形合並

十二、Seaborn

十三、使用seaborn函數繪制統計圖形

  13.1繪制柱狀圖

  13.2繪制散點圖

  13.3繪制箱線圖

  13.4繪制直方圖

  13.5折線圖

  13.6回歸圖

  13.7countplot

十四、繪圖風格

十五、plotly模塊

  15.1使用plotly繪制散點圖、折線圖

  15.2使用plotly繪制各類柱狀圖

  15.3使用plotly繪制直方圖

  15.4使用plotly繪制餅圖

十六、plotly下的圖形設置

  16.1多圖表

  16.2雙坐標軸

  16.3多子圖

=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=

一、繪圖參數詳解

plt.plot(x,y,ls=,lw=,c=,marker=,markersize=,markeredgecolor=,markerfacecolor, label=)

x:x軸上的數值

y: y軸上的數值

ls:折線的風格

lw:線條寬度

c:顏色

marker:線條上點的形狀

markersize:線條上點的形狀的大小

markeredgecolor:點的邊框色

markerfacecolor:點的填充色

label:圖例的標簽

import numpy as np import pandas as pd import matplotlib.pyplot as plt x = np.linspace(0,20,10) y = np.sin(x) plt.plot(x,y,c='red',lw=3,ls='--',marker='o',markersize=10,markeredgecolor='blue',markerfacecolor='black',label='Y=Sin(X)') plt.show()

繪圖的其他參數:

設置畫布的代碼參數 plt.figure(figsize=,dpi=,facecolor=)  figsize表示畫布的長寬,dpi表示分辨率,facecolor表示畫布邊框的顏色,畫布的設置一定要在畫圖之前

圖片的標題 plt.title(string,color=,size=,loc=)

X軸的標簽 plt.xlabel()

Y軸的標簽 plt.ylabel()

確定X軸范圍 plt.xlim() 

確定Y軸范圍 plt.ylim()

確定X軸的標簽刻度 plt.xticks()

確定Y軸的標簽刻度 plt.yticks() 

plt.plot(x,y,c='red',lw=3,ls='--',marker='o',markersize=10,markeredgecolor='blue',markerfacecolor='black',label='Y=Sin(X)')

展示圖例:loc參數表示圖例的位置(upper、lower、left、right、center),fontsize表示字體大小,frameon表示是否有邊框

   plt.legend(loc='best',fontsize=10,frameon=True)  #圖例就是plt.plot代碼里label定義的內容

保存圖片 plt.savefig(r'F:\data\case_picture.png') #一定要在show代碼前

import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #解決圖例顯示亂碼問題
plt.rcParams['axes.unicode_minus']=False  #解決某些標點符號顯示問題
x = np.linspace(0,20,10) y = np.sin(x) plt.figure(figsize=(5,3),dpi=150,facecolor='white') plt.title('This is a case') plt.xlabel('X軸的標簽') plt.ylabel('Y軸的標簽') plt.xlim([0,22])#確定X軸范圍
plt.ylim([-1.2,1.2])#確定Y軸范圍
plt.xticks([i*2 for i in range(0,11)])#確定X軸的標簽刻度
plt.yticks([-1,-0.75,-0.5,-0.25,-0.00,0.25,0.5,0.75,1.00]) #確定Y軸的標簽刻度
plt.plot(x,y,c='red',lw=3,ls='--',marker='o',markersize=10,markeredgecolor='blue',markerfacecolor='black',label='Y=Sin(X)') plt.legend(loc='best')  #展示圖例,loc參數表示圖例的位置
plt.savefig(r'F:\data\case_picture.png') plt.show()

線條風格:"-"、"--"、"-."、":"

填充形狀:"."、","、"o"、"v"、"^"、"<"、">"、"1"、"2"、"3"、"4"、"s"、"p"、"*"、"h"、"H"、"+"、"x"、"D"、"d"、"|"、"_"

二、折線圖

折線圖是將數據點按照順序連接起來的圖形,可以認為主要作用是查看y隨着x改變的趨勢,非常適合時間序列分析

import pandas as pd import matplotlib.pyplot as plt data = pd.read_excel(r'F:\data\國民經濟核算季度數據.xlsx') data.head(3)

輸出結果:

plt.rcParams['font.sans-serif']=['SimHei'] plt.figure(dpi=90) plt.plot(data.iloc[:,0], data.iloc[:,3],'bs--', data.iloc[:,0],data.iloc[:,4],'gh--', data.iloc[:,0],data.iloc[:,5],'ro--') plt.xlabel('年份',fontsize=10) plt.ylabel('生產總值',fontsize=10) plt.xticks(range(0,70,4), data.iloc[range(0,70,4),1], rotation=45,fontsize=10) plt.legend(['第一產業’,’第二產業','第三產業']) plt.show()

輸出結果: 

三、餅圖

餅圖用於實現可視化離散型變量的分布的一種圖形

plt.pie(x,explode,labels,colors,autopct=,pctdistance,shadow,startangle,radius,wedgeprops,textprops,center)

--explode:突出顯示

--labels:標簽

--colors:顏色

--autopct:百分比

--pctdistance:百分比標簽與圓心距離

--shadow:是否添加餅圖陰影效果

--labeldistance:設置各扇形標簽與圓心距離

--startangle:設置餅圖的初始擺放角度

--radius:設置餅圖半徑大小

--wedgeprops:設置餅圖內外邊界的屬性

--textprops:設置餅圖中文本屬性

 --center:設置中心位置

--counterclock:是否逆時針呈現

import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #解決圖例顯示亂碼問題
plt.rcParams['axes.unicode_minus']=False  #解決某些標點符號顯示問題
data = [10,20,40,15,35] area_name = ['橘子','蘋果','香蕉','獼猴桃','雪梨'] plt.figure(dpi=90) plt.pie(x=data,explode=[0,0.1,0,0,0.1],labels=area_name,colors=['red','green','blue','yellow','purple'],autopct='%.1f%%',\ pctdistance=0.6,labeldistance=1.1,radius=1.5,counterclock=False,\ wedgeprops={'linewidth':1.5,'edgecolor':'black'},\ textprops={'fontsize':15,'color':'black'},startangle=90) plt.title('水果銷量占比圖',pad=30,size=20) plt.axis('equal') plt.show()

 

注意:plt.axis('equal') 用於將餅圖顯示為正圓

四、條形圖

plt.bar(x, height,width,bottom,color,linewidth,tick_label,align)

x:指定x軸上數值

height:指定y軸上數值

width:指定條形圖寬度

color:條形圖的填充色

edgecolor:條形圖的邊框色

linewidth:條形圖邊框寬度

tick_label:條形圖的刻度標簽

align:指定x軸上對齊方式

import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] #解決圖例顯示亂碼問題
plt.rcParams['axes.unicode_minus']=False  #解決某些標點符號顯示問題
data = [10,20,40,15,35] area_name = ['橘子','蘋果','香蕉','獼猴桃','雪梨'] plt.figure(dpi=90) plt.bar(x=area_name,height=data,color='blue',edgecolor='black',linewidth=2,align='center') plt.xlabel('水果種類',labelpad=20) plt.ylabel('水果數量',labelpad=10) plt.title('各水果銷售數量',pad=30) plt.show()

五、直方圖

對於連續型變量,往往需要查看其分布圖,直方圖就是用來觀察數據的分布形態

直方圖,一般用來觀察數據的分布形態,橫坐標代表數值的分段,縱坐標代表了觀測數量和頻數,

直方圖有時候會和核密度圖搭配使用,主要是為了更加詳細的展示數據的分布特征

plt.hist(x,bins,range,normed,cumulative,bottom,align,rwidth,color,edgecolor,label)

x:數據

bin:條形個數

range:上下界

normed:是否將頻數轉換成頻率

cumulative:是否計算累計頻率

bottom:為直方圖的每個條形添加基准線,默認為0

align:對齊方式

rwidth:條形的寬度

color:填充色

edgecolor:設置直方圖邊框色

label:設置直方圖標簽

import numpy as np import pandas as pd import matplotlib.pyplot as plt data = [1,1,2,2,2,3,4,4,5,6,6,6,6] plt.rcParams['font.sans-serif']=['SimHei'] #解決圖例顯示亂碼問題
plt.rcParams['axes.unicode_minus']=False  #解決某些標點符號顯示問題
plt.figure(dpi=90) plt.hist(x=data,bins=15,align='left',color='blue',edgecolor='black') plt.show()

直方圖與核密度圖、正態分布曲線的搭配使用:

import numpy as np import pandas as pd import matplotlib. pyplot as plt data=pd.read_csv(r'F:\data\titanic_train.csv',sep=',') data.dropna(subset=['Age'],inplace=True) data.head ()

輸出結果:

import numpy as np
import pandas as pd
import matplotlib. pyplot as plt
data=pd.read_csv(r'F:\data\titanic_train.csv',sep=',')
data.dropna(subset=['Age'],inplace=True)
def normfun(x, mu,sigma):  #正態分布函數
    pdf=np.exp(-((x-mu)**2)/(2*sigma*2))/(sigma*np.sqrt(2*np.pi))
    return pdf
mean_x = data.Age.mean()
std_x = data.Age.std()
x = np.arange(data.Age.min(),data.Age.max(),1)
y=normfun(x,mean_x,std_x)
plt.rcParams['font.sans-serif']=['SimHei']
plt.hist(x=data.Age,bins=20,color='orange',edgecolor='black', density=True,label='直方圖')
plt.plot(x,y,color='green',linewidth=3,label='正態分布圖')
data.Age.plot(kind='kde',color='red',xlim=[0,90],label='核密度圖')
plt.xlabel('年齡',fontsize=10,labelpad=10)
plt.ylabel('頻率',fontsize=10,labelpad=10)
plt.title('年齡分布直方圖')
plt.legend(loc='best')
plt.show()

輸出結果:

六、散點圖

散點圖一般用來展示2個連續型變量的關系,可以通過散點圖來判斷兩個變量之間是否存在某種關系,

例如線性還是非線性關系

plt.scatter(x,y,s,c,marker,cmap,norm,alpha,linewidths,edgecolor)

x:x數據

y:y軸數據

s:散點大小

c:散點顏色

marker:散點圖形狀

cmap:指定某個colormap值,該參數一般不用,用默認值

alpha:散點的透明度

linewidths:散點邊界線的寬度

edgecolor:設置散點邊界線的顏色

import numpy as np import pandas as pd import matplotlib.pyplot as plt data = pd.read_excel(r'F:\data\散點圖.xlsx') x_data=data['電話次數'] y_data=data['銷售額'] plt.rcParams['font.sans-serif']=['SimHei'] #解決圖例顯示亂碼問題
plt.rcParams['axes.unicode_minus']=False  #解決某些標點符號顯示問題
plt.figure(dpi=90) plt.scatter(x=x_data,y=y_data,s=80,c='blue',marker='o',linewidths=1,edgecolor='black') plt.xlabel('電話次數',labelpad=10,size=10) plt.ylabel('銷售額',labelpad=10,size=10) plt.title('電話次數與銷售額關系',pad=20,size=20) plt.show()

不同種類下的散點圖:

import pandas as pd import matplotlib.pyplot as plt import os os.chdir('C: \datal第四章') data = pd.read_csv('iris.csv') data.head()

import numpy as np import pandas as pd import matplotlib.pyplot as plt import os os.chdir('C: \datal第四章') data = pd.read_csv('iris.csv') data.head() plt.rcParams['font.sans-serif']=['SimHei'] kind=['setosa','versicolor','virginica'] color_kind=['red','blue','green'] marker_kind=['o','x','v'] plt.figure(dpi=100) for i in range(0, 3): plt.scatter(x=data['Petal_Width'][data['Species']==kind[i]],\ y=data['Petal_Length'][data['Species']==kind[i]],\ color=color_kind[i],marker=marker_kind[i],\ label=kind[i]) plt.legend(loc='best') plt.xlabel('花瓣長度',fontsize=10) plt.ylabel('花瓣寬度',fontsize=10) plt.show ()

七、堆積條形圖

數據源:

 將數據源使用透視圖進行數據整理:

import numpy as np import pandas as pd import matplotlib.pyplot as plt data=pd.read_excel(r'F:\data\各產業季度產值.xlsx') data=pd.pivot_table(data=data,index='Quarter',values='GDP',columns='industr_Type',aggfunc=np.sum) data

創建各產業對應的四季度條形圖:

#需要畫出三張圖,第一產業四季度的條形圖、第二產業四季度的條形圖、第三產業四季度的條形圖,然后將三張圖堆疊起來
plt.bar(x=data.index.values,height=data['第一產業'],color='red',label='第一產業',tick_label=['第一季度','第二季度','第三季度','第四季度']) plt.bar(x=data.index.values,height=data['第二產業'],color='blue',label='第二產業',tick_label=['第一季度','第二季度','第三季度','第四季度']) plt.bar(x=data.index.values,height=data['第三產業'],color='green',label='第三產業',tick_label=['第一季度','第二季度','第三季度','第四季度'])

使用bottom參數進行三張圖的堆疊(使用bottom參數):

plt.figure(dpi=85) plt.bar(x=data.index.values,height=data['第一產業'],color='red',label='第一產業',tick_label=['第一季度','第二季度','第三季度','第四季度']) plt.bar(x=data.index.values,height=data['第二產業'],color='blue',label='第二產業',tick_label=['第一季度','第二季度','第三季度','第四季度'],\  bottom=data['第一產業'])  #這里的bottom可以表示第二幅圖是畫在第一幅圖上面的,即把第一幅圖用於畫圖的數據踩下去
plt.bar(x=data.index.values,height=data['第三產業'],color='green',label='第三產業',tick_label=['第一季度','第二季度','第三季度','第四季度'],\  bottom=data['第一產業']+data['第二產業'])#這里的bottom可以表示第三幅圖是畫在第一幅圖和第二幅圖上面的,即把第一幅圖用於畫圖的數據和第二幅圖用於畫圖的數據踩下去
plt.legend(bbox_to_anchor=(1.01,0.90),fontsize=10,frameon=True) plt.xlabel('季度',size=10,labelpad=10) plt.ylabel('產值(億)',size=10,labelpad=10) plt.title('各季度各產業產值堆積條形圖',size=20,pad=10) plt.show()

八、箱線圖

箱線圖是由一個箱體和一對箱須組成的統計圖形。箱體是由第一四分位數,中位數和第三四分位數所組成的。

在箱須的末端之外的數值可以理解成離群值,箱線圖可以對一組數據范圍大致進行直觀的描述

plt.boxplot(x,notch,sym,vert,whis,positions,widths,patch_artist,meanline,showmeans,boxprops,labels,flierprops)

x:數據

width:寬度

patch_artist:是否填充箱體顏色

meanline:是否顯示均值

showmeans:是否顯示均值

showfliers:是否表示有異常值

Meanprops:設置均值屬性,如點的大小,顏色等

medianprops:設置中位數的屬性,如線的類型,大小等

boxprops:設置箱體的屬性,邊框色和填充色

flierprops:設置異常值的屬性

cappops:設置箱線頂端和末端線條的屬性,如顏色,粗細等

import numpy as np import pandas as pd import matplotlib. pyplot as plt data = pd.read_excel(r'F:\data\sec_buildings.xlsx') plt.figure(figsize=(7,4),dpi=90) plt.boxplot(x=data['price_unit'],patch_artist=True,showmeans=True,showfliers=True,\ boxprops={'color':'black','facecolor':'steelblue'},\ flierprops={'markerfacecolor':'red','markersize':10},\ meanprops={'marker':'D','markerfacecolor':'indianred','markersize':10},\ medianprops={'linestyle':'--','color':'red'}) plt.title('二手房價格箱線圖') plt.show()

輸出結果:

九、圖形的完整設置

9.1圖例

圖例參數:

loc參數表示圖例的位置(upper、lower、left、right、center),

fontsize表示字體大小

frameon表示是否有邊框、

ncol表示圖例的排列列數

title表示標題

shadow:shadow線框是否添加陰影

fancybox:線框的圓角還是直角

#圖例就是畫圖代碼里label定義的內容

import numpy as np import pandas as pd import matplotlib.pyplot as plt data=pd.read_excel(r'F:\data\各產業季度產值.xlsx') plt.rcParams['font.sans-serif']=['SimHei'] data=pd.pivot_table(data=data,index='Quarter',values='GDP',columns='industr_Type',aggfunc=np.sum) plt.figure(dpi=90) plt.bar(x=data.index.values,height=data['第一產業'],color='red',label='第一產業',tick_label=['第一季度','第二季度','第三季度','第四季度']) plt.bar(x=data.index.values,height=data['第二產業'],color='blue',label='第二產業',tick_label=['第一季度','第二季度','第三季度','第四季度'],\ bottom=data['第一產業']) plt.bar(x=data.index.values,height=data['第三產業'],color='green',label='第三產業',tick_label=['第一季度','第二季度','第三季度','第四季度'],\ bottom=data['第一產業']+data['第二產業']) plt.legend(title='各產業對應圖',ncol=3,loc=2,fancybox=True,fontsize=10,frameon=True)  plt.xlabel('季度',size=10,labelpad=10) plt.ylabel('產值(億)',size=10,labelpad=10) plt.title('各季度各產業產值堆積條形圖',size=20,pad=10) plt.show()

loc對應數字的含義:

圖例在圖片外顯示:

import numpy as np import pandas as pd import matplotlib.pyplot as plt x = np.linspace(0,20,10) y = np.sin(x) plt.plot(x,y,c='red',lw=3,ls='--',marker='o',markersize=10,markeredgecolor='blue',markerfacecolor='black',label='Y=Sin(X)') plt.legend(bbox_to_anchor=(1.01,0.90),fontsize=10,frameon=True) plt.show()

bbox_to_anchor=(1.01,0.90)所表示的含義為先將圖片大小的長寬都看為1,然后將圖例放在長為1.01,高為0.9的位置,因為1.01超過了1.0,所以圖例顯示在了外面

9.2圖像大小

import numpy as np import pandas as pd import matplotlib.pyplot as plt x = np.linspace(0,20,10) y = np.sin(x) fig = plt.gcf() fig.set_size_inches(8,4) plt.plot(x,y,c='red',lw=3,ls='--',marker='o',markersize=10,markeredgecolor='blue',markerfacecolor='black') plt.show()

9.3繪制網格線

import numpy as np import pandas as pd import matplotlib.pyplot as plt x = np.linspace(0,20,10) y = np.sin(x) plt.grid(ls='--',c='grey') #繪制網格線,線形為--,顏色為灰色
plt.plot(x,y,c='red',lw=3,ls='--',marker='o',markersize=10,markeredgecolor='blue',markerfacecolor='black') plt.show()

9.4繪制參考線

import numpy as np import pandas as pd import matplotlib.pyplot as plt x = np.linspace(0,20,10) y = np.sin(x) plt.plot(x,y,c='black',lw=3,ls='--') plt.axhline(y=0.25,c='red',ls='--',lw=1) #繪制平行於X軸的參考線
plt.axvline(x=10,c='red',ls='--',lw=1) #繪制平行於Y軸的參考線 #如果x軸為某個列表里漢字的話,則使用索引進行定位
plt.show()

9.5繪制參考區域

import numpy as np import pandas as pd import matplotlib.pyplot as plt x = np.linspace(0,20,10) y = np.sin(x) plt.plot(x,y,c='black',lw=3,ls='--') plt.axvspan(xmin=10,xmax=15,facecolor='red',alpha=0.3) #繪制平行於Y軸的參考區域,從10開始,到15結束,顏色為紅色,透明度為0.3
plt.axhspan(ymin=0,ymax=0.5,facecolor='blue',alpha=0.3) #繪制平行於X軸的參考區域,從0開始,到0.5結束,顏色為藍色,透明度為0.3
plt.show()

9.6畫布的使用

fig=plt.figure()#創建畫布

ax =fig.add_axes([a,b,c,d])

該參數是一個4元素列表,第一個元素代表距離最左邊的距離,第二個元素代表距離最下面的距離,可以理解為畫布左下角的起點坐標,第三個元素和第四個代表畫布的長度和和寬度

import numpy as np import pandas as pd import matplotlib.pyplot as plt data=pd.read_excel(r'F:\data\各產業季度產值.xlsx') plt.rcParams['font.sans-serif']=['SimHei'] data=pd.pivot_table(data=data,index='Quarter',values='GDP',columns='industr_Type',aggfunc=np.sum) fig=plt.figure()#創建畫布
ax =fig.add_axes([0.2,0.15,1.6,1.2]) plt.bar(x=data.index.values,height=data['第一產業'],color='red',label='第一產業',tick_label=['第一季度','第二季度','第三季度','第四季度']) plt.bar(x=data.index.values,height=data['第二產業'],color='blue',label='第二產業',tick_label=['第一季度','第二季度','第三季度','第四季度'],\ bottom=data['第一產業']) plt.bar(x=data.index.values,height=data['第三產業'],color='green',label='第三產業',tick_label=['第一季度','第二季度','第三季度','第四季度'],\ bottom=data['第一產業']+data['第二產業']) plt.legend(title='各產業對應圖',ncol=3,loc=2,fancybox=True,fontsize=10,frameon=True) plt.xlabel('季度',size=10,labelpad=10) plt.ylabel('產值(億)',size=10,labelpad=10) plt.title('各季度各產業產值堆積條形圖',size=20,pad=10) plt.show()

9.7調整刻度軸

暫無,看書補充,雲開見明講了個錘子

9.8圖形添加文本內容

一個是添加圖形內容細節的指向型注釋文本,另外一個是添加圖形細節的無指向型注釋文本

無指向型注釋文本:

plt.text(x,y,string,weight,color,fontsize)

x,y表示添加文本內容的坐標,string表示添加文本的內容,weight表示字體粗細風格,color表示顏色,fontsize表示字體大小

import numpy as np import pandas as pd import matplotlib.pyplot as plt x = np.linspace(0,20,10) y = np.sin(x) fig = plt.gcf() fig.set_size_inches(8,4) #調整圖像的大小
plt.plot(x,y,c='red',lw=3,ls='--',marker='o',markersize=10,markeredgecolor='blue',markerfacecolor='black') plt.text(6.5,0.75,'這是添加的文本內容',fontsize=15,color='blue',weight='bold') plt.show()

指向型注釋文本:

plt.annotate(string,xy=(),xytext=(),weight=,color=,arrowprops=dict(arrowstyle= '->’,connection=‘acr3’,color=))

string:圖形內容的注釋文本

xy:被注釋圖形內容的位置坐標

xytext:注釋文本的位置坐標

weight:注釋文本的字體粗細風格

arrowprop:指示被注釋內容的箭頭的屬性字典,arrowstyle=表示箭頭的形狀,使用此參數時只修改color、arrowstyle參數即可,其他參數使用默認就ok

import numpy as np import pandas as pd import matplotlib.pyplot as plt x = np.linspace(0,20,10) y = np.sin(x) fig = plt.gcf() fig.set_size_inches(8,4) #調整圖像的大小
plt.rcParams['font.sans-serif']=['SimHei'] plt.plot(x,y,c='red',lw=3,ls='--',marker='o',markersize=10,markeredgecolor='blue',markerfacecolor='black') plt.annotate('最大值點',xy=(19.5,0.90),xytext=(2.9,0.5),color='blue',fontsize=15,arrowprops=dict(arrowstyle='<->',color='blue',)) plt.show()

可以使用 plt.annotate? 查看參數的可選范圍等信息

十、繪制雙坐標軸

在數據分析中,很多時候,由於變量之間量綱級不一樣,如果繪制在同一個坐標軸上,量綱級較小的變量就很難看出變化趨勢,所以需要繪制雙坐標軸,來顯示兩個變量的趨勢

import pandas as pd import matplotlib.pyplot as plt data = pd.read_excel('F:\data\Region.xlsx') plt.rcParams['font.sans-serif']=['SimHei'] fig = plt.figure() axis_1 = fig.add_subplot(111) axis_1.plot(data.index,data.Sales,label='銷量',color='blue') axis_1.set_ylabel('不同地區銷量情況') plt.legend(loc='upper left') axis_2 = axis_1.twinx() axis_2.plot(data.index,data.Trans_Cost,color='red',label='成本') plt.legend(loc='upper center') plt.show()

十一、多個圖形合並

subplot2grid函數可以讓子區跨越固定的網格布局的多個行和列,實現不同的子區布局

plt.subplot2grid(shape,loc,colspan,rowspan)

參數:

shape:網格布局(幾行幾列的布局)

loc:表示圖形的位置起點(從0開始)

colspan:跨越的列數

rowspan:跨越的行數

import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams['font.sans-serif']=['SimHei'] plt.figure(figsize=(16,9)) #畫第一幅圖,從(0,0)開始,占一行兩列
plt.subplot2grid((2,3),(0,0),colspan=2,rowspan=1) x = np.linspace(0,40,10) y = np.sin(x) plt.plot(x,y,c='black',lw=3,ls='--') plt.axvspan(xmin=10,xmax=15,facecolor='red',alpha=0.3) plt.axhspan(ymin=0,ymax=0.5,facecolor='blue',alpha=0.3) #畫第二幅圖,從(0,2)開始,占兩行一列
plt.subplot2grid((2,3),(0,2),colspan=1,rowspan=2) x = np.linspace(0,20,10) y = np.sin(x) plt.plot(x,y,c='black',lw=3,ls='--') plt.axvspan(xmin=10,xmax=15,facecolor='red',alpha=0.3) plt.axhspan(ymin=0,ymax=0.5,facecolor='blue',alpha=0.3) #畫第三幅圖,從(1,0)開始,占一行兩列
plt.subplot2grid((2,3),(1,0),colspan=2,rowspan=1) x = np.linspace(0,20,10) y = np.sin(x) plt.grid(ls='--',c='grey') plt.plot(x,y,c='red',lw=3,ls='--',marker='o',markersize=10,markeredgecolor='blue',markerfacecolor='black') plt.show()

十二、Seaborn

Seaborn是在matplotlib發展的,使得作圖更加容易,也容易繪制更加精致的圖形,並且兼容pandas和numpy等數據結構

import seaborn as sns  #導入seaborn庫

 使用seaborn繪制圖形,有三種方式,分別如下:

--plt.style.use( ‘seaborn’)

--sns.set()

--調用seaborn函數

但對於簡單的制圖,使用前兩種都可以,但對於復雜圖形,可能會使用第三種方式

plt.style.use( ‘seaborn’):

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns plt.style.use('seaborn') plt.rcParams['font.sans-serif']=['SimHei'] #需要加在plt.style.use('seaborn')之后
plt.rcParams['axes.unicode_minus']=False data = pd.read_excel(r'F:\data\GDP.xlsx') plt.figure(figsize=(4,3),dpi=100) plt.bar(x=data.city.index.values,height=data.gdp,color='blue',tick_label=data.city) plt.ylabel('GDP萬億') plt.show()

sns.set():

style:為繪圖風格,一共五種風格

context:控制繪圖元素的規模

Palette:調色板

Font:這個參數—般不管,不用調整

font_scale:字體大小

color_codes:—般用默認值

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns sns.set(style='darkgrid',context='notebook',font_scale=1.2) data = pd.read_excel(r'F:\data\GDP.xlsx') plt.figure(figsize=(4,3),dpi=100) plt.bar(x=data.city.index.values,height=data.gdp,color='blue',tick_label=data.city) plt.ylabel('GDP萬億') plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False plt.show()

調用seaborn函數:

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns data = pd.read_excel(r'F:\data\GDP.xlsx') plt.figure(figsize=(4,3),dpi=100) sns.barplot(x='city',y='gdp',data=data,color='red',orient='v')#orient='h'表示橫向條形圖,只不過x和y的數據要調換下順序
plt.show()

給柱狀圖上加上數據值標簽:

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns data = pd.read_excel(r'F:\data\GDP.xlsx') plt.figure(figsize=(4,3),dpi=100) sns.barplot(x='city',y='gdp',data=data,color='red',orient='v') for x,y in enumerate(data.gdp): plt.text(x,y+0.1,"%s萬億"%round(y,1),ha='center',fontsize=10) plt.show()

十三、使用seaborn函數繪制統計圖形

13.1繪制柱狀圖

sns.barplot(x='Quarter',y='GDP',hue='industr_Type',data=data,color='blue',palette='husl',orient='v')

x,y:不同坐標上的值

hue:分類變量

data:數據

color:顏色

palette:調色板

orient:方向(vertical:垂直,horizontal:水平〕

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns data = pd.read_excel(r'F:\data\各產業季度產值.xlsx') plt.figure(figsize=(8,5),dpi=100) sns.barplot(x='Quarter',y='GDP',hue='industr_Type',data=data,color='blue',palette='husl',orient='v') plt.ylabel('GDP') plt.legend(bbox_to_anchor=(1.01,0.85),frameon=True) plt.rcParams['font.sans-serif']=['SimHei'] plt.show()

13.2繪制散點圖

繪制柱狀圖語法如下:

sns.scatterplot(x,y,hue,data,color,palette,style,s,markers

x,y:不同坐標上的值

hue:分類變量

data:數據

color:顏色

palette:調色板

style:以分類變量作圖時產生不同的形狀

s:形狀人小

markers:形狀

import pandas as pd import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(7,5),dpi=120) iris = pd.read_csv(r'F:\data\iris.csv') sns.scatterplot(x='Petal_Width',y='Petal_Length',data=iris,hue='Species',color='red',s=20,style='Species') plt.xlabel('花瓣寬度') plt.ylabel('花瓣長度') plt.rcParams['font.sans-serif']=['SimHei'] plt.show()

對比plt模塊下的分類散點圖代碼,相比之下簡單許多

plt模塊下的分類散點圖代碼:

import numpy as np import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv(r'F:\data\iris.csv') plt.figure(figsize=(7,5),dpi=120) plt.rcParams['font.sans-serif']=['SimHei'] kind=['setosa','versicolor','virginica'] color_kind=['red','blue','green'] marker_kind=['o','x','v'] plt.figure(dpi=100) for i in range(0, 3): plt.scatter(x=data['Petal_Width'][data['Species']==kind[i]],\ y=data['Petal_Length'][data['Species']==kind[i]],\ color=color_kind[i],marker=marker_kind[i],\ label=kind[i]) plt.legend(loc='best') plt.xlabel('花瓣長度',fontsize=10) plt.ylabel('花瓣寬度',fontsize=10) plt.show ()

13.3繪制箱線圖

sns.boxplot(x,y,hue,data,order,width,fliersize,linewidth,color,palette)

x,y不同坐標上的值

hue:分類變量

data:數據

width:箱線寬度

fliersize:異常值點的人小

color:顏色

palette:調色板

linewidth:指定箱體邊框的寬度

(這里的參數和plt模塊下的參數一模一樣,只不過調用函數名不同而已,詳情請點擊這里)

創建分類的箱線圖時,需要加上order=datd.index代碼語句

13.4繪制直方圖

import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from scipy.stats import norm plt.figure(figsize=(7,5),dpi=120) Titanic = pd.read_csv(r'F:\data\titanic_train.csv') Titanic.dropna(subset=['Age'],inplace =True) plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False Age_Male = Titanic[Titanic.Sex =='male']['Age'] Age_Female = Titanic[Titanic.Sex =='female']['Age'] sns.distplot(Age_Male,bins=30,kde=False,hist_kws={'color':'steelblue'},norm_hist=True,label='男性') sns.distplot(Age_Male,hist=False,kde=False,fit=norm,fit_kws={'color':'yellow'},norm_hist=True,label='男性正態分布圖') sns.distplot(Age_Female,bins=30,kde=False,hist_kws={'color':'steelblue'},norm_hist=True,label='女性') sns.distplot(Age_Female,hist=False,kde=False,fit=norm,fit_kws={'color':'blue'},norm_hist=True,label='女性正態分布圖') plt.legend(loc='best') plt.show()

bins=30表示繪制30個柱狀格

kde=Fasle表示不繪制核密度圖

hist_kws=表示控制直方屬性的參數

norm_hist=True表示以頻率形式展示

hist=False表示不繪制直方圖的柱狀形態

雲開見明很多都沒講,需要自己查書來了解各個參數的含義

13.5折線圖

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import os os.chdir('C:\data\第四章') data = pd.read_csv('財政收入data.csv') data['year']=range(1994,2014,1) sns.set(style='ticks') #設置風格為tickes
plt.rcParams['font.sans-serif']=['SimHei'] sns.lineplot(x='year',y='y',data=data,lw=2,color='blue') #繪制折線圖
plt.xticks(range(1994,2014,1),range(1994,2014,1),rotation=45) #rotation表示旋轉角度
plt.show()

13.6回歸圖

回歸圖本質就是將兩個變量之間的線性關系展示出來

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns data=pd.read_excel('F:\data\散點圖.xlsx') plt.figure(dpi=100) sns.lmplot(x='電話次數',y='銷售額',data=data,legend_out=False,markers='o',fit_reg=True,\ aspect=2,height=5,scatter_kws={'s':20,'facecolor':'red'}) plt.savefig('F:\data\散點圖.png') plt.show()

fit_reg=True表示是否將數據進行擬合

aspect=2表示長度為2

height=5表示高度為5

scatter_kws=表示散點圖的屬性設置

13.7countplot

主要用於繪制數據中,每個類別出現的數量,只能計數

源數據截圖如下:

比如想繪制不同的Region下的訂單量的柱狀圖:

import pandas as pd import seaborn as sns import matplotlib.pyplot as plt plt.figure(dpi=100) data=pd.read_excel('C: \datal第四章\Prod_Trade.xlsx') sns.countplot(x='Region',data=data) plt.rcParams['font.sans-serif']=['SimHei'] plt.show()

分類變量的設置:

例如繪制各個Region下每種出行方式訂單量的柱狀圖:

import pandas as pd import seaborn as sns import matplotlib.pyplot as plt plt.figure(dpi=100) data=pd.read_excel('C: \datal第四章\Prod_Trade.xlsx') sns.countplot(x='Region',data=data,hue='Transport') plt.rcParams['font.sans-serif']=['SimHei'] plt.show()

十四、繪圖風格

sns.set(style,context,palette)

style:主題樣式:darkgrid(灰白背景+網格)、 whitegrid(白白背景+灰網格)、 dark 、white、 ticks(帶坐標軸刻度)

context:可以理解為設置輸出圖片元素的大小尺寸paper、notebook, talk、and poster (元素縮放)

palette:調色板deep、muted、pastel、bright、dark、colorblind,palette一般可以用默認值

font_scale:表示坐標軸的縮放(一般1.2左右)

import pandas as pd import seaborn as sns import matplotlib.pyplot as plt plt.figure(dpi=100) sns.set(style='darkgrid',context='notebook',font_scale=1.2,palette='bright') data=pd.read_excel('C:\datal第四章\Prod_Trade.xlsx') sns.countplot(x='Region',data=data,hue='Transport') plt.rcParams['font.sans-serif']=['SimHei'] plt.show()

十五、plotly模塊

plotly是一個基於JavaScript的繪圖庫,plotly繪圖種類豐富,效果美觀,易於保存與分享plotly的繪圖結果可以與Web無縫集成

plotly默認的繪圖結果是一個HTML網頁文件,通過瀏覽器可以查看

在真實項目中,使用plotly繪圖模塊進行繪圖的完整流程包括:

1.添加圖軌數據,例如使用Scatter函數

2.設置畫圖布局,使用layout命令

3.集成圖形、布局數據

4.繪制圖形的輸出命令是offline.plot

關於圖形輸出命令:

使用plotly.offline.plot和Plotly.offline.iplot()

使用plotly.offline.plot方法會在本地新建一個HTML文件,並可以選擇是否在瀏覽器中打開這個文件

使用會在plotly.offline.iplot()方法會在Jupyter Notebook中直接繪圖

import plotly as py import plotly.graph_objs as go #graph_objs是plotly庫下一個用於繪制圖形對象的模塊
from plotly.graph_objs import Scatter #從graph_objs模塊中導入Scatter函數
py.offline.init_notebook_mode() #使圖形可以順利顯示在jupyter notebook中

示例:

import plotly as py import plotly.graph_objs as go
from plotly.graph_objs import Scatter 
py.offline.init_notebook_mode() 
try_1=Scatter(x=[1,2,3,4,5],y=[15,19,17,18,13]) data=[try_1] py.offline.iplot(data)

15.1使用plotly繪制散點圖、折線圖

plotly繪制散點圖、折線圖都是使用Scatter函數

import plotly as py import plotly.graph_objs as go go.Scatter()

語法格式:

Scatter(x,y,mode,name,marker,line)

x----數據

y----數據

mode ----線條類型(markers表示散點圖、lines表示折線圖、markers+lines表示線上有散點的組合圖)

name ----圖例名稱

marker ------控制點的相關參數

line -----控制線條顏色

布局控制語法格式:

go.Layout(title,xaxis, yaxis)

title ----標題

xaxis ----控制x軸參數

yaxis-----控制y軸參數

數據處理完成、布局控制處理完成后,需要使用go.Figure()將兩者集合起來,go.Figure()中的data必須是列表形式

源數據展示:

import pandas as pd import numpy as np import plotly as py import plotly.graph_objs as go from plotly.graph_objs import Scatter py.offline.init_notebook_mode() data = pd.read_csv('C:\datal第四章\income_tax.csv') try_1 = Scatter(x=data['year'],y=data['x2'],mode='markers',name='在職員工工資總收入') try_2 = Scatter(x=data['year'],y=data['x3'],mode='lines',name='社會消費品零售總額') try_3 = Scatter(x=data['year'],y=data['x8'],mode='markers+1ines',name='地區生產總值') layout = go.Layout(title='各指標隨年份變化圖',xaxis=dict(title='年份'),yaxis=dict(title='指標'),\ legend=dict(x=1,y=0.8,font=dict(size=12,color='black'))) data_list = [try_1,try_2,try_3] fig = go.Figure(data=data_list,layout=layout) py.offline.iplot(fig)

15.2使用plotly繪制各類柱狀圖

import plotly as py import plotly.graph_objs as go go.Bar()

plotly繪制柱狀圖使用Bar函數

例如想繪制不同地區的訂單量柱狀圖,因為plotly中沒有seaborn的countplot方法,所以稍微麻煩

seaborn的countplot方法點擊這里

源數據展示:

import pandas as pd import plotly as py import plotly.graph_objs as go py.offline.init_notebook_mode() data = pd.read_excel('C:\data\第四章\Prod_Trade.xlsx') data_region=data['Region'].value_counts() try_1=[go.Bar(x=data_region.index.tolist(),y=data_region.values.tolist(),\ marker=dict(color=['red','blue','yellow','green','orange','darkblue']),\ opacity=0.50)] layout=go.Layout(title='各分區訂單量',xaxis=dict(title='地區'),yaxis=dict(title='訂單量')) fig=go.Figure(data=try_1,layout=layout) py.offline.iplot(fig)

使用plotly繪制分類柱狀圖

分類柱狀圖的原理就是在plotly中畫n個柱狀圖,然后plotly會自動調整為分類的柱狀圖,但是一般不建議使用plotly繪制,可以使用seabron的countplot方法,點擊跳轉

源數據展示:

import pandas as pd import plotly as py import plotly.graph_objs as go data=pd.read_excel('F:\data\各產業季度產值.xlsx') data_1=data[data['industr_Type']=='第一產業'] data_2=data[data['industr_Type']=='第二產業'] data_3=data[data['industr_Type']=='第三產業'] try_1=go.Bar(x=data_1.Quarter,y=data_1['GDP'],name='第一產業') try_2=go.Bar(x=data_2.Quarter,y=data_2['GDP'],name='第二產業') try_3=go.Bar(x=data_3.Quarter,y=data_3['GDP'],name='第三產業') data=[try_1,try_2,try_3] layout=go.Layout(title='各產業季度產值',xaxis=dict(title='季度')) fig=go.Figure(data=data,layout=layout) py.offline.iplot(fig)

使用plotly繪制堆積柱狀圖

在plotly中繪制堆積柱狀圖只需要在分類柱狀圖的基礎上給go.Layout語句加一個參數即可

barmode='stack'
import pandas as pd import plotly as py import plotly.graph_objs as go data=pd.read_excel('F:\data\各產業季度產值.xlsx') data_1=data[data['industr_Type']=='第一產業'] data_2=data[data['industr_Type']=='第二產業'] data_3=data[data['industr_Type']=='第三產業'] try_1=go.Bar(x=data_1.Quarter,y=data_1['GDP'],name='第一產業') try_2=go.Bar(x=data_2.Quarter,y=data_2['GDP'],name='第二產業') try_3=go.Bar(x=data_3.Quarter,y=data_3['GDP'],name='第三產業') data=[try_1,try_2,try_3] layout=go.Layout(title='各產業季度產值',xaxis=dict(title='季度'),barmode='stack') fig=go.Figure(data=data,layout=layout) py.offline.iplot(fig)

15.3使用plotly繪制直方圖

import plotly as py import plotly.graph_objs as go go.Histogram()

源數據展示:

import pandas as pd import plotly as py import plotly.graph_objs as go data=pd.read_csv(r'C: \datal第四章1titanic_train.csv') try_1=[go.Histogram(x=data['Age'],histnorm='probability',marker=dict(color='blue'))] py.offline.iplot(try_1)

histnorm='probability'表示繪制成頻率的形式,而不是頻數的形式

15.4使用plotly繪制餅圖

import plotly as py import plotly.graph_objs as go go.Pie()

源數據展示:

import pandas as pd import plotly as py import plotly.graph_objs as go data=pd.read_excel(r'F:\data\region_count.xlsx') try_1=[go.Pie(labels=data['region'].tolist(),values=data['count'].tolist(),\ hole=0.4,textfont=dict(size=12,color='white'))] layout=go.Layout(title='不同地區訂單量') fig=go.Figure(data=try_1,layout=layout) py.offline.iplot(fig)

hole=0.4表示餅圖中間空心圓的半徑大小

十六、plotly下的圖形設置

plotly下的圖形設置主要分為以下三個部分:

多圖表、雙坐標軸、多子圖

16.1多圖表

需求:將每個地區的訂單量繪制成柱狀圖,再將所有地區訂單量的平均值繪制出來,觀察每個地區的訂單量和平均值的差異

源數據展示:

import numpy as np import pandas as pd import plotly as py import plotly.graph_objs as go data=pd.read_excel(r'F:\data\region_count.xlsx') data_y=np.tile(np.mean(data['count']),6)  #將count的平均值復制6次
try_1=go.Bar(x=data['region'].tolist(),y=data['count'].tolist(),\ marker=dict(color=['red','blue','yellow','green','orange','darkblue']),\ opacity=0.4) try_2=go.Scatter(x=data.region.tolist(),y=data_y,mode='lines',name='平均值') num=[try_1,try_2] layout=go.Layout(title='不同地區訂單量',xaxis=dict(title='地區')) fig=go.Figure(data=num,layout=layout) py.offline.iplot(fig)

16.2雙坐標軸

源數據展示:

import numpy as np import pandas as pd import plotly as py import plotly.graph_objs as go data=pd.read_excel(r'F:\data\雙軸圖.xlsx') data['時間']=pd.to_datetime(data['時間']) try_1=go.Bar(x=data['時間'].tolist(),y=data['數量'].tolist(),marker=dict(color='steelblue'),opacity=0.6,name='評價數量') try_2=go.Scatter(x=data['時間'].tolist(),y=data['差評率'].tolist(),mode='lines',name='差評率折線圖',yaxis='y2') case=[try_1,try_2] layout=go.Layout(title='客戶評價圖',xaxis=dict(title='時間'),yaxis=dict(title='評價數量'),\ yaxis2=dict(title='差評率',overlaying='y',side='right'),\ legend=dict(x=0.1,y=0.9),font=dict(size=12,color='black')) fig=go.Figure(data=case,layout=layout) py.offline.iplot(fig)

yaxis='y2' 表示第二條y軸

overlaying='y',side='right' 表示將第二條坐標軸在右邊進行y軸的重疊

16.3多子圖

使用matplotlib中的subplot2grid函數也可以達到多子圖的效果,詳情請點擊這里

在plotly中繪制雙子圖需要從plotly庫中導入一個方法

import plotly.graph_objs as go from plotly import tools fig=tools.make_subplots(rows=2,cols=1)

源數據展示:

import numpy as np import pandas as pd import plotly as py import plotly.graph_objs as go from plotly import tools fig=tools.make_subplots(rows=2,cols=1) data=pd.read_excel(r'F:\data\雙軸圖.xlsx') data['時間']=pd.to_datetime(data['時間']) try_1=go.Bar(x=data['時間'].tolist(),y=data['數量'].tolist(),marker=dict(color='steelblue'),opacity=0.6,name='評價數量') try_2=go.Scatter(x=data['時間'].tolist(),y=data['差評率'].tolist(),mode='lines',name='差評率折線圖') fig.append_trace(try_1,1,1) fig.append_trace(try_2,2,1) fig['layout'].update(height=600,width=800,title='客戶評價情況') py.offline.iplot(fig)

fig=tools.make_subplots(rows=2,cols=1) 表示多子圖有兩行一列

fig.append_trace(try_1,1,1) 表示將try_1的圖行放到多子圖的第一行第一列

fig.append_trace(try_2,2,1) 表示將try_1的圖行放到多子圖的第二行第一列

plotly中多子圖示:(是從一開始的)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM