matplotlib绘制图形四板斧

前言

去年的时候写了一篇关于matplotlib的几种常用画图方法,今天偶然当时写的文章觉得还是仍有许多要改进的地方,花了一个下午的时间又重新整理了下,废话少说,直接开始。

什么是Matplotlib

Matplotlib是是个Python 2D绘图库,它可用于Python脚本、Python Shell、Jupyter笔记本,Web应用程序服务器和四个图形用户界面工具包,说了一堆废话,我自己也没搞明白到底要说啥,换句人话呢就是一个绘制图形的工具,例如可以绘制日常见的条形图、折线图、扇形图等。 

学习Matplotlib的用处

1、可以做数据处理的可视化辅助工具,能够清晰的理解数据,从而帮助调整分析方法。                                                                2、能够将数据直观呈现出来,使数据更加客观,更具有说服力。

常见图形绘制方法

        折线图绘制

折线的颜色和形状设置

设置图片大小和保存图片

绘制X轴和Y轴的刻度

设置中文显示

 一图多个座标系子图

 设置座标轴范围

改变座标轴的默认显示方式

 绘制散点图

绘制条形图

竖向条形图

横向条形图

并列和罗列条形图

绘制饼状图


 

折线图绘制

首先在进行图形绘制前需要导入相关的库,在这里我们使用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()

运行结果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章