Catalog:Click to jump to the corresponding position
=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=
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()
輸出結果:
圖例參數:
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,所以圖例顯示在了外面
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()
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()
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()
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()
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()
暫無,看書補充,雲開見明講了個錘子
一個是添加圖形內容細節的指向型注釋文本,另外一個是添加圖形細節的無指向型注釋文本
無指向型注釋文本:
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是在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()
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()
繪制柱狀圖語法如下:
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 ()
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代碼語句
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表示不繪制直方圖的柱狀形態
雲開見明很多都沒講,需要自己查書來了解各個參數的含義
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()
回歸圖本質就是將兩個變量之間的線性關系展示出來
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=表示散點圖的屬性設置
主要用於繪制數據中,每個類別出現的數量,只能計數
源數據截圖如下:
比如想繪制不同的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是一個基於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)
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)
import plotly as py import plotly.graph_objs as go go.Bar()
plotly繪制柱狀圖使用Bar函數
例如想繪制不同地區的訂單量柱狀圖,因為plotly中沒有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)
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'表示繪制成頻率的形式,而不是頻數的形式
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下的圖形設置主要分為以下三個部分:
多圖表、雙坐標軸、多子圖
需求:將每個地區的訂單量繪制成柱狀圖,再將所有地區訂單量的平均值繪制出來,觀察每個地區的訂單量和平均值的差異
源數據展示:
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)
源數據展示:
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軸的重疊
使用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中多子圖示:(是從一開始的)