1、导入库
在cmd里执行pip install matplotlib
2、常用功能,如颜色、刻度、标题,中文
2.1展示图形
# 导入模块
import matplotlib.pyplot as plt
# 在jupyter中执行的时候显示图片(其他不用写)
%matplotlib inline
# 传入x和y, 通过plot画图
plt.plot([1, 0, 9], [4, 5, 6])
# 在执行程序的时候展示图形
plt.show()
2.2、线条颜色、透明度、线的样式、线条粗细
from matplotlib import pyplot as plt
x = range(1,8) # x轴的位置
y = [17, 17, 18, 15, 11, 11, 13]
# 传入x和y, 通过plot画折线图
plt.plot(x, y, color='red',alpha=0.2,linestyle = '--',linewidth=3,marker='o')
plt.show()
2.3保存图片
注意:save要在show之前使用。否则保存的为空图。
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)
plt.plot(x,y)
plt.savefig('./cai.png') #指定路径:plt.savefig('D:/cai.png')
plt.show()
1)figsize:指定figure的宽和高,单位为英寸;
2)dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80 1英寸等于2.5cm,A4纸是 21*30cm的纸张
3)图片的格式也可以保存为svg这种矢量图格式,这种矢量图放在网页中放大后不会有锯齿
plt.savefig('./cai.svg')
2.4、横轴纵轴的刻度
理解一下:plt.xticks(x) #列表
#刻度显示的个数,如从2开始显示,2、4、6、8依次显示,相当于把整个列表里的值显示在x轴
#xticks(x,x_ticks_label)中第一参数代表刻度即分成了多少份,第二个参数是在每个刻度上 真正显示的内容(刻度值)。若没有第二个参数,解释如上
from matplotlib import pyplot as plt
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) #列表
#刻度显示的个数,如从2开始显示,2、4、6、8依次显示,相当于把整个列表里的值显示在x轴
# 设置y轴的刻度
# plt.yticks(y)
# y(11,30)
plt.yticks(range(min(y),max(y)+1))
# 构造x轴刻度标签
x_ticks_label = ["{}:00".format(i) for i in x]
# #rotation = 45 让字旋转45度
#xticks中第一参数代表刻度即分成了多少份,第二个参数是在每个刻度上 真正显示的内容(刻度值)
plt.xticks(x,x_ticks_label,rotation = 60)
# # 设置y轴的刻度标签
y_ticks_label = ["{}℃".format(i) for i in range(min(y),max(y)+1)]
plt.yticks(range(min(y),max(y)+1),y_ticks_label)
# 绘图
plt.plot(x,y)
plt.show()
2.5坐标信息、标题(中文显示方法)
1)中文:使用matplotlib中的font_manager库,单独导入
其中Windows的中文字体路径C:\Windows\Fonts\ (使用对应字体时,右键属性,复制其文件名即可)
2)坐标信息
plt.xlabel plt.ylabel 后面跟坐标信息内容
3)标题
plt.title 后面跟标题内容
下面看代码:
from matplotlib import pyplot as plt
import random
from matplotlib import font_manager
#显示中文
x= range(0,200)
y=[random.randint(10,30) for i in x]
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y)
#获取一种字体,赋给my_font变量
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\simkai.ttf',size=18)
#添加坐标信息
plt.xlabel('时间',fontproperties=my_font,rotation=45)
plt.ylabel('天气',fontproperties=my_font)
#添加标题信息
plt.title('次数',fontproperties=my_font,color='red',size=30)
plt.show()
2.6添加图例(多线的时候,标注每条线是干嘛的)
plt.legend(prop=my_font,loc=‘upper right’)
只有图例使用prop获取中文其他都是fontproperties
loc参数用来获取图例的位置,有‘upper left/lower left/center left/upper center’等
PS;网格plt.grid
from matplotlib import pyplot as plt
from matplotlib import font_manager
x= range(0,10)
y1=range(0,10)
y2=range(5,15)
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y1,color='red',label='小花')
plt.plot(x,y2,color='blue',label='小爱')
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\simkai.ttf',size=18)
plt.legend(prop=my_font,loc='upper right')
plt.grid(alpha=1)
plt.show()
3、散点图
x=range(0,5)
y=[3,7,2,8,9]
plt.scatter(x,y)
plt.show()
4、条形图
坑一:绘图时不识别字符串类型的数据,会使用列表的下标绘图
#错误示例,使用字符串类型,导致数据错误使用下标绘图
from matplotlib import pyplot as plt
a = ['流浪地球', '疯狂的外星人', '飞驰人生', '大黄蜂', '熊出没·原始时代', '新喜剧之王']
b = ['38.13', '19.85', '14.89', '11.36', '6.47', '5.93']
#b = [38.13, 19.85, 14.89, 11.36, 6.47, 5.93]
plt.figure(figsize=(20, 8), dpi=80)
plt.bar(range(len(a)), b, width=0.3, color='red')
plt.show()
正确方法:使用列表生成式,讲字符串转换成浮点型数据
from matplotlib import pyplot as plt
from matplotlib import font_manager
a = ['流浪地球', '疯狂的外星人', '飞驰人生', '大黄蜂', '熊出没·原始时代', '新喜剧之王']
b = ['38.13', '19.85', '14.89', '11.36', '6.47', '5.93']
#b = [38.13, 19.85, 14.89, 11.36, 6.47, 5.93]
plt.figure(figsize=(20, 8), dpi=80)
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\simkai.ttf',size=18)
#设置x,y轴刻度和刻度值
plt.xticks(range(len(a)), a, fontproperties=my_font)
plt.yticks(range(0, 41, 5), range(0, 41, 5))
rects=plt.bar(range(len(a)), [float(i) for i in b], width=0.3, color='red')
#条形图上加标注(居中)
for rect in rects:
# 获取每条数据的height值(y)
height = rect.get_height()
# 显示文本值,长为x(此处x为柱的左边)+宽度的一半,即柱的正中间;高度加一点代表在空白处标注
plt.text(rect.get_x() + rect.get_width() / 2, height + 0.3, str(height), ha="center")
plt.show()
5、并列条形图
画两个条形图,第二个图的起始x值为,第一个图的起始x值+宽度
import matplotlib.pyplot as plt
import numpy as np
index = np.arange(4)
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()
6、饼状图
返回值:
patches : matplotlib.patches.Wedge列表(扇形实例)
l_text:label matplotlib.text.Text列表(标签实例)
p_text:label matplotlib.text.Text列表(百分比标签实例)
import matplotlib.pyplot as plt
import matplotlib
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='C:\Windows\Fonts\simkai.ttf',size=18)
label_list = ["第一部分", "第二部分", "第三部分"] # 各部分标签
size = [55, 35, 10] # 各部分大小--计算 (数据源)
color = ["red", "green", "blue"] # 各部分颜色
explode = [0, 0.05, 0] # 各部分突出值
"""
绘制饼图
explode:设置各部分突出
label:设置各部分标签
labeldistance:设置标签文本距圆心位置,1.1表示1.1倍半径
autopct:设置圆里面文本
shadow:设置是否有阴影
startangle:起始角度,默认从0开始逆时针转
pctdistance:设置圆内文本距圆心距离
返回值:
patches : matplotlib.patches.Wedge列表(扇形实例)
l_text:label matplotlib.text.Text列表(标签实例)
p_text:label matplotlib.text.Text列表(百分比标签实例)
"""
plt.figure(figsize=(10, 10), dpi=100) #画布不是正方形的话,画出的图就是椭圆
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)
# p_text 扇形里面的标签值
for t in p_text:
t.set_size(18)
# patches 返回扇形实例
for i in patches:
i.set_color('pink')
break
#break的作用是取出第一个并改变颜色后,立刻跳出;不加的话,所有扇形都被改为pink
plt.legend(prop=my_font)
plt.show()