前言
去年的時候寫了一篇關於matplotlib的幾種常用畫圖方法,今天偶然當時寫的文章覺得還是仍有許多要改進的地方,花了一個下午的時間又重新整理了下,廢話少說,直接開始。
什麼是Matplotlib
Matplotlib是是個Python 2D繪圖庫,它可用於Python腳本、Python Shell、Jupyter筆記本,Web應用程序服務器和四個圖形用戶界面工具包,說了一堆廢話,我自己也沒搞明白到底要說啥,換句人話呢就是一個繪製圖形的工具,例如可以繪製日常見的條形圖、折線圖、扇形圖等。
學習Matplotlib的用處
1、可以做數據處理的可視化輔助工具,能夠清晰的理解數據,從而幫助調整分析方法。 2、能夠將數據直觀呈現出來,使數據更加客觀,更具有說服力。
常見圖形繪製方法
折線圖繪製
首先在進行圖形繪製前需要導入相關的庫,在這裏我們使用fmatplotlib中的pyplo來進行圖像繪製,方法確定後還需要確定x,y軸的大小、刻度值、折線的寬度、折線的樣式、顏色、標題等等,這裏呢就不一一具體詳細描述了,有興趣的可以自己去官網查看https://matplotlib.org/。
#導入
import matplotlib.pyplot as plt
#繪製折線
plt.plot([1,0,9],[4,5,6])
plt.show()
運行結果:
這樣看的話,是不是柑橘光禿禿的呢,一點都不美觀呢,那接下來我們對其進行深一步的編輯、渲染。
折線的顏色和形狀設置
from matplotlib import pyplot as plt
#1、確定x,y軸位置
x = range(1,8)
y = (2,4,6,9,4,17,14)
#2傳入x,y值,通過plot方法繪製折線圖
#color 代表顏色,alpah代表透明度,linestyle代表先的樣式,linewidth代表線寬度,marker代表折點樣式,markersize代表折點大小,markeredgecolor代表折點邊框顏色
plt.plot(x,y,color = 'red',alpha = 0.5,linestyle = '--',linewidth = 3,marker='o',markersize = '20',
markeredgecolor = 'green',markeredgewidth = 5)
#3 展示圖形
plt.show()
運行結果:
設置圖片大小和保存圖片
#圖片的保存
from matplotlib import pyplot as plt
import random
x = range(2,26,2)
y = [random.randint(15,30) for i in x]
plt.figure(figsize=(20,8),dpi=80) #figsize代表畫布的大小,dpi代表繪製的圖像的分辨率
plt.plot(x,y)
plt.savefig('./t1.png') #保存圖片,圖片的形式也可以保存爲svg這種矢量圖格式,還有plt.savefig要放在plt.show前面,否則的話保存的圖片會是一個空白。
#plt.show()
繪製X軸和Y軸的刻度
在繪製圖形時,我們還需要對x軸和y軸的刻度單位進行設置,不然的話,給我們一張折線圖我們並不知道x,y軸各代表的什麼意思,這裏我們需要用到plt.xticks和plt.yticks來設置,給大家看一下代碼演示。
from matplotlib import pyplot as plt
import random
x = range(2,26,2)
y = [random.randint(15,30) for i in x]
plt.figure(figsize=(20,8),dpi=80)
#設置x軸刻度的疏密程度
#plt.xticks(x)
#plt.xticks(range(1,25))
#構造X軸標籤
x_table = ["{}:00".format(i) for i in x]
#x代表疏密程度,x_table代表刻度名稱
plt.xticks(x,x_table,rotation = 45)
#設置y軸
y_table = ["{}:d°".format(i) for i in range(min(y),max(y)+1)]
#y代表疏密程度,y_table代表刻度名稱
plt.yticks(range(min(y),max(y)+1),y_table,rotation = 45)
plt.plot(x,y)
plt.show()
運行結果:
設置中文顯示
在繪製的圖形中,我們中國人的標題內容都是中文,但是matplotlib是不支持的,在這裏我們需要使用matplotlib 中的font_manager方法來進行設置,代碼如下:
#設置中文
from matplotlib import pyplot as plt
import random
x = range(0,120)
y = [random.randint(15,30) for i in x]
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y)
#設置圖片標題
from matplotlib import font_manager
#設置中文標題,字號18
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\simhei.ttf',size=18)
plt.title('圖片',fontproperties = my_font)
#x軸辯題
plt.xlabel('時間',fontproperties = my_font)
#y軸標題
plt.ylabel('溫度',fontproperties = my_font)
plt.show()
運行結果:
一圖多個座標系子圖
#一圖多個座標系子圖
from matplotlib import pyplot as plt
import numpy as np
x = np.arange(1,100)
#新建figure
fig = plt.figure(figsize=(20,10),dpi = 80)
#新建子圖1,add_subplot中的2,2代表將畫布分成2*2等分,即可以畫4個子圖
ax1 = fig.add_subplot(2,2,1)
ax1.plot(x,x)
#新建子圖2
ax2 = fig.add_subplot(2,2,2)
ax2.plot(x,x**2)
ax2.grid(color = 'r',linestyle = '--',linewidth = 1,alpha = 0.3)
#新建子圖3
ax3 = fig.add_subplot(2,2,3)
ax3.plot(x,np.log(x))
plt.show()
運行結果:
設置座標軸範圍
#設置座標軸範圍
from matplotlib import pyplot as plt
import numpy as np
x = np.arange(-10,11,1)
y = x**2
plt.plot(x,y)
#調整x軸的左右兩邊
#plt.xlim([-5,5])
#只調一邊,只顯示x軸-4到4時y軸對應的值
# plt.xlim(xmin=-4)
# plt.xlim(xmax = 4)
#只調一邊
plt.ylim(ymin = 0)
plt.xlim(xmin = 0)
plt.show()
運行結果:
改變座標軸的默認顯示方式
#改變座標軸的默認顯示方式
from matplotlib import pyplot as plt
import numpy as np
x = range(0,14,2)
y = [-3,-2,-1,0,1,2,3]
plt.figure(figsize=(20,8),dpi=80)
#plt.plot(x,y)
#獲得當前圖表的圖像
ax = plt.gca()
#設置圖形的包圍線
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['left'].set_color('red')
ax.spines['bottom'].set_color('black')
#設置底邊的移動範圍,移動到y軸的0位置,‘data’:移動軸的位置到交叉軸的指定座標
#ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
plt.plot(y,x)
plt.show()
運行結果:
繪製散點圖
from matplotlib import pyplot as plt
from matplotlib import font_manager
y = [11,17,16,11,12,13,14,12,16,17,17,18,14,19,22,16,18,19,24,22,25,16,18,15,22,19,20,22,15,18,24]
x = range(1,32)
#設置圖像大小
plt.figure(figsize=(20,8),dpi=80)
#使用散點圖繪製圖形
plt.scatter(x,y,label = '3月份')
#調整x軸刻度
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\simhei.ttf',size=18)
x_tickes = ['3月{}號'.format(i) for i in x]
plt.xticks(x[::3],x_tickes[::3],fontproperties = my_font,rotation = 45)
plt.xlabel('日期',fontproperties = my_font)
plt.ylabel('溫度',fontproperties = my_font)
plt.legend(prop = my_font)
plt.show()
運行結果:
繪製條形圖
豎向條形圖
#繪製條形圖
from matplotlib import pyplot as plt
import numpy as np
from matplotlib import font_manager
a = ['流浪地球','瘋狂的外星人','飛馳人生','大黃蜂','熊出沒*原始時代','新喜劇之王']
b = ['38.13','19.85','14.89','11.36','6.47','5.93']
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\simhei.ttf',size=18)
plt.figure(figsize=(20,8),dpi=80)
#繪製條形圖
rects = plt.bar(range(len(a)),[float(i) for i in b],width = 0.3,color = ['r','g','b','r','g','b'])
plt.xticks(range(len(a)),a,fontproperties = my_font)
plt.yticks(range(0,41,5),range(0,41,5))
#在條形圖上加備註(水平居中)
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2,height + 0.3,str(height),ha = 'center')
plt.show()
運行結果:
橫向條形圖
#橫向條形圖
#繪製條形圖
from matplotlib import pyplot as plt
import numpy as np
from matplotlib import font_manager
a = ['流浪地球','瘋狂的外星人','飛馳人生','大黃蜂','熊出沒*原始時代','新喜劇之王']
b = ['38.13','19.85','14.89','11.36','6.47','5.93']
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\simhei.ttf',size=18)
plt.figure(figsize=(20,8),dpi=80)
#繪製橫向的條形圖
#plt.bar(b,a)
rects = plt.barh(range(len(a)),b,height = 0.5,color = 'r')
plt.yticks(range(len(a)),a,fontproperties = my_font,rotation = 45)
#在條形圖上加標註(水平居中)
for rect in rects:
width = rect.get_width()
#print(width)
plt.text(width,rect.get_y()+0.3/2,str(width),va = 'center')
plt.show()
運行結果:
並列和羅列條形圖
from matplotlib import pyplot as plt
import numpy as np
index = np.arange(4)
print(index)
BJ = [50,55,53.,60]
SH = [44,66,55,41]
#並列
plt.bar(index,BJ,width = 0.3)
# plt.bar(index + 0.3 ,SH,width=0.3,color = 'green')
# plt.xticks(index + 0.3/2,index)
#羅列
plt.bar(index,SH,bottom=BJ,width = 0.3,color = 'green')
plt.show()
運行結果:
繪製餅狀圖
#餅狀圖
from matplotlib import pyplot as plt
import numpy as np
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\simhei.ttf',size=10)
label_list = ['第一部分','第二部分','第三部分']
size = [55,35,10]
color = ['red','green','blue']
explode = [0,0.05,0]
plt.figure(figsize=(20,8),dpi=80)
patches,l_text,p_text = plt.pie(size,explode=explode,colors=color,labels=label_list,labeldistance=1.1,autopct="%1.1f%%",shadow=False,
startangle=90,pctdistance=0.6)
for t in l_text:
# print(dir(t))
t.set_fontproperties(my_font)
for i in l_text:
t.set_size(18)
for i in patches:
i.set_color('pink')
break
plt.legend(prop = my_font,loc = 'upper right')
#plt.savefig('./t2.jpg')
plt.show()
運行結果: