一、前言
Matplotlib 是一个 Python的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
二、安装
用pip命令安装第三方库
pip install matplotlib
三、小试牛刀(直线图、折线图)
先绘制个简单的图形,先导入pyplot
模块,然后定义点的坐标,再调用plot方法连线绘图,然后设置图形的属性,最后保存和展示图形。
PS:savefig()方法必须放在show()方法前。
from matplotlib import pyplot as plt # 导入pyplot模块
# 定义点的坐标,即x、y坐标
x = range(10)
y1 = [i * 2 for i in x]
y2 = [i * 3 for i in x]
# 调用plot方法连线绘图
plt.plot(x, y1, linewidth=1, color="orange", marker="o", label="hhhhhhhh")
plt.plot(x, y2, ":ro", label="ssssss")
plt.xlabel("angle") # 设置x轴名称
plt.ylabel("sine") # 设置y轴名称
# 设置横纵坐标
plt.xticks([0, 2, 4, 6, 8, 10, 12])
plt.yticks([0, 5, 10, 15, 20, 25])
plt.title('sine wave') # 设置标题
plt.grid() # 设置网格模式
plt.legend(["xxxxx", "yyyyyy"], loc="upper left") # 设置线条标识
# 设置每个点上的数值
for i in range(10):
plt.text(x[i], y2[i], y2[i], fontsize=12, color="black", style="italic", weight="light", verticalalignment='center',
horizontalalignment='right', rotation=0)
plt.savefig('demo.jpg') # 保存图形,此方法必须放在show()前面,否则保存的是一个空白图
# 使用show展示图形
plt.show()
结果:
常用方法介绍
-
plt.plot(x, y, "格式控制字符串", 关键字=参数)
- x、y分别是横纵坐标。
- 格式控制字符串最多可以包括三部分, "线型","颜色", "点型",。入参顺序:线型-》颜色-》点型
线型:linestyle=['-','--','-.',':']
颜色:color=['b','g','r','c','m','y','k','w']
点型:marker=['.',',','o','v','^','<','>','1','2','3','4','s','p','*','h','H','+','x','D','d','|','_','.',',']
- 关键字参数,例如线条标识
label
plot()
设置的属性会被legend()的覆盖,legend()
优先级更高
-
plt.text(x, y, s, fontsize, verticalalignment,horizontalalignment,rotation , **kwargs)
- x,y表示标签添加的位置,默认是根据坐标轴的数据来度量的,是绝对值,也就是说图中点所在位置的对
应的值。 - s表示标签的符号,字符串格式。
- fontsize顾名思义就是你加标签字体大小了,取整数。
- verticalalignment表示垂直对齐方式 ,可选 ‘center’ ,‘top’ , ‘bottom’,‘baseline’ 等。
- horizontalalignment表示水平对齐方式 ,可以填 ‘center’ , ‘right’ ,‘left’ 等。
- rotation表示标签的旋转角度,以逆时针计算,取整。
- 后面还有 family 用来设置字体,style 设置字体的风格,weight 字体的粗细, bbox 给字体添加框,如
bbox=dict(facecolor=‘red’, alpha=0.5) 等,各种风格,应有尽有,总有一款适合你。
- x,y表示标签添加的位置,默认是根据坐标轴的数据来度量的,是绝对值,也就是说图中点所在位置的对
-
pyplot.legend(handles,labels,loc)
参考传送门
handles需要传入你所画线条的实例对象,即调用plt.plot()返回的对象。
labels是图例的名称(能够覆盖在plt.plot( )中label参数值)。
loc代表了图例在整个坐标轴平面中的位置(一般选取'best'这个参数值)。supported values are 'best', 'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center'
# 用法一,直接在legend()定义label line1, = plt.plot(n, m1, color='r', linewidth=1.5, linestyle='-') line2, = plt.plot(n, m2, 'b') plt.legend(handles=[line1, line2], labels=['girl购物欲望','boy购物欲望'], loc='best') plt.legend(labels=['girl购物欲望','boy购物欲望'], loc='best') # 这样写也OK,默认一一对应 # 用法二 plt.plot(n, m1, color='r', linewidth=1.5, linestyle='-', label='女生购物欲望') # 给plt.plot( )中参数label=''传入字符串类型的值,也就是图例的名称 plt.plot(n, m2, 'b', label='男生购物欲望') # 使用plt.legend( )使上述代码产生效果 plt.legend()
四、饼图
plt.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1,
startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False,
rotatelabels=False, hold=None, data=None)
pie 函数参数详解
- x :(每一块)的比例,如果sum(x) >1会使用sum(x)归一化;
- labels :(每一块)饼图外侧显示的说明文字;
- explode :(每一块)离开中心距离;
- startangle :起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;
- shadow :在饼图下面画一个阴影。默认值:False,即不画阴影;
- labeldistance :label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内侧;
- autopct :控制饼图内百分比设置,可以使用format字符串或者format function'%1.1f'指小数点前后位数(没有用空格补齐);
- pctdistance :类似于labeldistance,指定autopct的位置刻度,默认值为0.6;
- radius :控制饼图半径,默认值为1;counterclock:指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。
- wedgeprops:字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:* * wedgeprops={'linewidth':3}设置wedge线宽为3。
- textprops:设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。
- center:浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。
- frame:布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。
- rotatelabels:布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度。
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 设置字体
plt.style.use('fivethirtyeight')
languages = ['JavaScript', 'HTML/CSS', 'SQL', 'Python', 'Java']
popularity = [59219, 55466, 47544, 36443, 35917]
plt.pie(popularity, labels=languages, autopct='%1.1f%%',
counterclock=False, startangle=90, explode=[0, 0.2, 0, 0, 0])
plt.title('top5 编程语言占比')
plt.tight_layout() # 自动调整子图的尺寸使充满整个figure
plt.show()
五、柱状图
import matplotlib.pyplot as plt
import random
# 解决中文乱码问题
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams["axes.unicode_minus"] = False
# 定义x轴、y轴数据
x_data = ["20{}年".format(i) for i in range(16, 22)]
y_data = [random.randint(100, 300) for i in range(6)]
# 绘图
for i in range(len(x_data)): # 编写渲染使柱状图颜色不同
plt.bar(x_data[i], y_data[i])
# 添加数据标签
for i in range(len(x_data)):
plt.text(x_data[i], y_data[i], y_data[i])
plt.title("销量分析")
plt.xlabel("年份")
plt.ylabel("销量")
plt.show()
plt.bar(x,height,[width=0.8][,align='center'][,color='blue'])
- x:表示x坐标的取值.
- height:条形图每个条形的高度,即y坐标的取值。
- width:条形图每个条形的宽度,取值为0~1,默认为0.8。
- align:将条形与x坐标对齐的方式,align='center'表示将条形底边中心置于x坐标的位置,align='edge'表示将条形的左边缘与x坐标位置对齐。
-
color:条形的颜色,默认为'blue'
并列柱状图
# 导入扩展包
import matplotlib.pyplot as plt
import numpy as np
# 构造数据
y1 = [1, 4, 6, 8, 9, 4, 3, 8]
y2 = [2, 5, 9, 5, 3, 2, 7, 4]
x = np.arange(len(y1))
# 设置柱状图的宽度
width = 0.4
# 绘图
plt.figure(figsize=(8, 4))
plt.bar(x=x, height=y1, width=width, label='Data1')
plt.bar(x=x + width, height=y2, width=width, label='Data2')
# 添加数据标签
for x_value, y_value in zip(x, y1):
plt.text(x=x_value, y=y_value, s=y_value)
for x_value, y_value in zip(x, y2):
plt.text(x=x_value + width, y=y_value, s=y_value)
# 添加图标题和图例
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
plt.title('并列柱状图')
plt.legend()
plt.show()