什么是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()

python matplotlib 线条 节点 matplotlib绘制点线图_数据分析

  • 可以看到,我们的横坐标本来设置了100个,只显示了7个,这是matplotlib自动生成的,若要设置x轴的刻度精度,就要使用一个函数,plt.xticks(可迭代对象),里面增添一个可迭代对象
  • plt.xticks([1,2,3],[‘fir’,‘sec’,‘thir’]),也可以这样使用,在x轴上1对应’fir’,2对应’sec’,3对应’thir’,在后续的例子中我们会用到

下面附上线条的样式

python matplotlib 线条 节点 matplotlib绘制点线图_数据分析_02


设置中文的方法(若不设置,中文将无法显示)

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()

python matplotlib 线条 节点 matplotlib绘制点线图_matplotlib_03

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

python matplotlib 线条 节点 matplotlib绘制点线图_python_04


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()

python matplotlib 线条 节点 matplotlib绘制点线图_matplotlib_05


可以发现,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()

python matplotlib 线条 节点 matplotlib绘制点线图_matplotlib_06

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()

python matplotlib 线条 节点 matplotlib绘制点线图_数据分析_07

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()

python matplotlib 线条 节点 matplotlib绘制点线图_python_08

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()

python matplotlib 线条 节点 matplotlib绘制点线图_matplotlib_09