什么是Matplotlib?
Matplotlib 是一个 Python 的 2D绘图库,通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。
- 接下来,给几个绘图很常用很重要的函数,接着我们再来做实例
1. 绘制线形图
1.1.简单的线形图
import numpy as np
from matplotlib import pyplot as plt
# 生成[0, 2π]之间的等间距的100个点
x = np.linspace(0,2 * np.pi,100)
y = np.sin(x)
# 其中传入两个可迭代对象,x轴,y轴
# x,y都是对应的,一个x对应一个y,在图上描点,之后连接起来
# 至于x轴,y轴的数据修改,需要另外的函数
plt.plot(x,y)
plt.show()
- 可以看到,我们的横坐标本来设置了100个,只显示了7个,这是matplotlib自动生成的,若要设置x轴的刻度精度,就要使用一个函数,plt.xticks(可迭代对象),里面增添一个可迭代对象
- plt.xticks([1,2,3],[‘fir’,‘sec’,‘thir’]),也可以这样使用,在x轴上1对应’fir’,2对应’sec’,3对应’thir’,在后续的例子中我们会用到
下面附上线条的样式
设置中文的方法(若不设置,中文将无法显示)
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
1.2. 绘制多条折线
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x1 = np.linspace(0,2 * np.pi,100)
y1 = np.sin(x1)
x2 = np.linspace(0,2 * np.pi,100)
y2 = np.cos(x2)
plt.plot(x1,y1)
plt.plot(x2,y2)
plt.xlabel('度数')
plt.ylabel('值')
plt.title('正弦余弦图')
plt.xticks(list(x1)[::10])
plt.show()
1.3. 将DataFrame绘制成折线图
1.3.1.首先准备一个DataFrame对象
import numpy as np
from matplotlib import pyplot as plt
import pandas as pd
dict1 = {
'东软医疗':np.random.randint(5,100,5),
'东软熙康':np.random.randint(5,100,5),
'东软睿道':np.random.randint(5,100,5)
}
data_frame = pd.DataFrame(dict1)
data_frame
1.3.2. 绘图
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.xticks([0,1,2,3,4,5],[(str(i) + '月') for i in range(1,6)])
# 设置网格
plt.grid()
# 设置横坐标名称
plt.xlabel('月份')
# 设置
plt.ylabel('人数(万人)')
plt.title('东软子公司1-5月份在职人员数量')
plt.plot(data_frame)
plt.show()
可以发现,DataFrame中的每一列都是一条折线
2. 绘制条形图
条状图也是非常常用的一种图表类型. 条形图是统计图资料分析中最常用的图形。主要特点有:
- 能够使人们一眼看出各个各个项目数据的大小。
- 易于比较各个不同项目数据之间的差别。
import matplotlib.pyplot as plt
import numpy as np
# 设置中文
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 条的数量
index = np.arange(5)
fig = plt.figure(figsize=(20,8),dpi=80)
# 三个数组,每个数组都能生成5个条
values1 = np.random.randint(11, 20, 5)
values2 = np.random.randint(11, 20, 5)
values3 = np.random.randint(11, 20, 5)
# 绘制条形图,第一个传入条形图的数量,第二个传入每一条的数据(长度)
# 第三个设置条的宽度,第四个这组数据的名称
plt.bar(index,values1,width=0.3,label = '社保项目1')
plt.bar(index - 0.3,values2,width=0.3,label = '社保项目2')
plt.bar(index + 0.3,values3,width=0.3,label = '社保项目3')
# 设置x轴的显示
plt.xticks(index,['社保项目' + str(i + 1) for i in index])
# 设置x轴的名称
plt.xlabel('项目类型')
# 设置y轴的名称
plt.ylabel('项目合同额(亿元)')
# 设置图例,loc是图例的位置位置
plt.legend(loc=0)
plt.show()
3. 绘制水平条形图
from matplotlib import pyplot as plt
import numpy as np
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 准备数据
index = np.arange(5)
values1 = np.random.randint(10, 17, 5)
values2 = np.random.randint(10, 17, 5)
values3 = np.random.randint(10, 17, 5)
# 绘图
plt.barh(index,values1,height=0.3,label='社保项目1')
plt.barh(index + 0.3,values2,height=0.3,label='社保项目2')
plt.barh(index - 0.3,values3,height=0.3,label='社保项目3')
# 设置y轴刻度
plt.yticks(range(5),[i for i in 'ABCDE'])
# 设置y轴名称
plt.ylabel('项目合同(亿元)')
# 设置x轴名称
plt.xlabel('项目类型')
# 设置表格标题
plt.title('社保项目营收')
# 显示每一条的数量
for a,b in zip(values1,index):
plt.text(a,b,a)
for a,b in zip(values2,index + 0.3):
plt.text(a,b,a)
for a,b in zip(values3,index - 0.3):
plt.text(a,b,a)
# 显示图例
plt.legend(loc=0)
plt.show()
4. 绘制饼图
from pandas import Series, DataFrame
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
%matplotlib inline
# 设置图像大小
plt.figure(figsize=(9,9))
# 设置标签
labels = ['Java开发', '项目经理', '测试运维人员', 'Python开发', '架构师']
# 标签对应的值
values = [6000, 1000, 2000, 7000, 500]
# 每一个标签饼图的颜色
colors = ['red', '#FEDD62', 'blue', 'gray', 'green']
# 那一块内容需要脱离饼图凸显, 可选值0-1
explode = [0.1, 0.1, 0, 0, 0]
# autopct='%1.1f%%'表示显示百分比
# shadow显示阴影
# startangle 正值表示逆时针旋转
plt.pie(values,
labels=labels,
colors=colors,
explode=explode,
startangle=90,
shadow=True,
autopct='%1.1f%%')
# 设置为标准圆形
plt.axis('equal')
# 显示图例
plt.legend(loc=2)
plt.title('东软软件工程师人员职位占比')
plt.show()
5. 绘制散点图
x = np.random.normal(0, 1, 100) # 均值为0 方差为1 正态分布
y = np.random.normal(0, 1, 100)
plt.scatter(x,y)
plt.show()
6. 绘制子图
x = np.linspace(0.0,5.0)
y1 = np.sin(np.pi*x)
y2 = np.sin(np.pi*x*2)
# subplot(2,1,1) 2行一列的第一个图
# (总共2行1列,这是第一个图)
plt.subplot(2,1,1)
plt.ylabel('y1 value')
plt.plot(x, y1, 'b--')
# subplot(2,1,2) 2行一列的第二个图
# (总共2行1列,这是第二个图)
plt.subplot(2,1,2)
plt.ylabel('y2 value')
plt.plot(x, y2, 'r--')
plt.xlabel('x value')
plt.show()