Matplotlib 是一个 Python 的 2D绘图库,通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。
官方网站http://matplotlib.org
- 用于创建出版质量图表的绘图工具库
- 最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建
- 目的是为Python构建一个Matlab式的绘图接口
- pyploy模块包含了常用的matplotlib API函
线性图
简单线性图
在图表的所有类型中,线性图最为简单。线性图的各个数据点由一条直线来连接. 一对对(x, y)值组成的数据点在图表中的位置取决于两条轴(x和y)的刻度范围.
如果要绘制一系列的数据点,需要创建两个Numpy数组. 首先, 创建包含x值的数组, 用作x轴. 再创建包含y值得数组,用作y轴. 完成了两个数组创建,只需要调用plot()函数绘制图像即可.
from matplotlib import pyplot as plt
import numpy as np
# 生成[0, 2π]之间的等间距的100个点
x = np.linspace(0, 2* np.pi,num=100)
y = np.sin(x)
plt.plot(x,y)
plt.show()
线条和标记节点样式: 标记字符:标记线条中的点:
- 线条颜色,color='g'
- 线条风格,linestyle='--'
- 线条粗细,linewidth=5.0
- 标记风格,marker='o'
- 标记颜色,markerfacecolor='b'
- 标记尺寸,markersize=20
- 透明度,alpha=0.5
-
线条和标记节点格式字符 如果不设置颜色,系统默认会取一个不同颜色来区别线条.
接下来我们绘制一个样式较全的线形图:
import numpy as np
import matplotlib.pyplot as plt
# 设置中文字体,否则中文会出现方框状
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(0, 2* np.pi,num=10)
y = np.sin(x)
# 调用绘制线性图函数plot()
plt.plot(x, y,
color='#3589FF', # 线的颜色
linestyle=':', # 线的风格
linewidth=3, # 线的宽度
marker='o', # 标记点的样式
markerfacecolor='r', # 标记点的颜色
markersize=10, # 标记点的大小
alpha=0.7, # 图形的透明度
label="cos(x)"
)
plt.show()
绘制多条折线
# 绘制多条折线
x = np.linspace(0, 2* np.pi,num=20)
y = np.sin(x)
# 调用绘制线性图函数plot()
plt.plot(x, y,
color='#3589FF', # 线的颜色
linestyle=':', # 线的风格
linewidth=3, # 线的宽度
marker='o', # 标记点的样式
markerfacecolor='r', # 标记点的颜色
markersize=10, # 标记点的大小
alpha=0.7, # 图形的透明度
label="sin(x)" #设置图例的label
)
siny = y.copy()
cosy = np.cos(x)
plt.plot(x, cosy,
color='y', # 线的颜色
linestyle='-', # 线的风格
linewidth=3, # 线的宽度
marker='*', # 标记点的样式
markerfacecolor='b', # 标记点的颜色
markersize=15, # 标记点的大小
alpha=0.9, # 图形的透明度
label="cos(x)" #设置图例的label
)
# 设置x,y轴的label
plt.xlabel('时间(s)')
plt.ylabel('电压(V)')
plt.legend()
plt.title('电压随时间变化的线性图')
# 调用show方法显式
plt.show()
将DataFrame绘制成线性图
from pandas import DataFrame,Series
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
data_frame = DataFrame({
'东软熙康': np.random.randint(10, 100, 5),
'东软医疗': np.random.randint(10, 100, 5),
'东软睿道': np.random.randint(10, 100, 5),
})
plt.plot(data_frame, marker='o')
# 显示图例
plt.legend(data_frame, loc=2)
# 设置x轴刻度标签
plt.xticks([0, 1, 2, 3, 4], ['first', 'secod', 'third', 'forth', 'fifth'])
plt.title('东软子公司1-5月份在职人员数量')
plt.xlabel('月份')
plt.ylabel('在职人数(百人)')
# True 显示网格
# linestyle 设置线显示的类型(一共四种)
# color 设置网格的颜色
# linewidth 设置网格的宽度
# plt.grid(True, linestyle = "-.", color = "r", linewidth = "3")
plt.grid()
# 显示图形
plt.show()
条状图
条状图也是非常常用的一种图表类型.
条形图是统计图资料分析中最常用的图形。主要特点有:
- 能够使人们一眼看出各个各个项目数据的大小。
- 易于比较各个不同项目数据之间的差别。
垂直条状图
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
index = np.arange(5)
values1 = np.random.randint(11, 20, 5)
values2 = np.random.randint(11, 20, 5)
values3 = np.random.randint(11, 20, 5)
# bar宽度
bar_width = 0.3
# 每一个bar占0.3宽度
plt.bar(index-bar_width, values1, width=bar_width, alpha=0.7, label='社保项目1', color='b')
plt.bar(index, values2, width=bar_width, alpha=0.7, label='社保项目2', color='r')
plt.bar(index+bar_width, values3, width=bar_width, alpha=0.7, label='社保项目3', color='g')
# 显示图例
plt.legend(loc=1)
# 设置X轴、Y轴数值范围
# plt.xlim(-0.5, 5)
# plt.ylim(10, 20)
plt.axis([-0.6, 5, 10, 20])
# 设置x轴刻度标签 rotation旋转角度
plt.xticks(index, ['社保项目'+str(ix) for ix in range(1, 6)], rotation=30)
# 设置标题
plt.title('社保项目营收', fontsize=20)
plt.xlabel('项目类型')
plt.ylabel('项目合同额(亿元)')
# 显示数值标签
for a,b in zip(index, values1):
plt.text(a-bar_width, b, '%.0f' % b, ha='center', va= 'bottom', fontsize=7)
for a,b in zip(index, values2):
plt.text(a, b, '%.0f' % b, ha='center', va= 'bottom', fontsize=7)
for a,b in zip(index, values3):
plt.text(a+bar_width, b, '%.0f' % b, ha='center', va= 'bottom', fontsize=7)
# 显示网格
plt.grid()
plt.show()
水平条状图
import matplotlib.pyplot as plt
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)
# 绘制条状图
bar_height = 0.3
plt.barh(index, values1, height=0.3, label='社保项目1', color='r')
plt.barh(index+bar_height, values2, height=0.3, label='社保项目2', color='b')
plt.barh(index+bar_height*2, values3, height=0.3, label='社保项目2', color='y')
# y轴标签
plt.yticks(index + bar_height, list('ABCDE'))
# 显示数值标签
for a, b in zip(values1, index):
plt.text(a, b, '%.0f' % a, ha='left', va= 'center', fontsize=7)
for a, b in zip(values2, index):
plt.text(a, b+bar_height, '%.0f' % a, ha='left', va= 'center', fontsize=7)
for a, b in zip(values3, index):
plt.text(a, b+bar_height*2, '%.0f' % a, ha='left', va= 'center', fontsize=7)
# 设置标题
plt.title('社保项目营收', fontsize=20)
plt.xlabel('项目类型')
plt.ylabel('项目合同额(亿元)')
plt.axis([0, 20, -0.4, 5])
plt.legend(loc=4)
plt.show()
饼图
除了条状图, 饼图也可以用来表示数据.用pie()函数制作饼图很简单.
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()
散点图
用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。散点图将序列显示为一组点。值由点在图表中的位置表示。类别由图表中的不同标记表示。散点图通常用于比较跨类别的聚合数据。
简单的散点图绘制
from matplotlib import pyplot as plt
import numpy as np
# 散点 横轴和纵轴都是特征
x = np.random.normal(0, 1, 100) # 均值为0 方差为1 正态分布
y = np.random.normal(0, 1, 100)
plt.scatter(x, y)
plt.show()
x = np.random.normal(0, 1, 100000)
y = np.random.normal(0, 1, 100000)
plt.scatter(x, y)
plt.show()
x = np.random.normal(0, 1, 100000)
y = np.random.normal(0, 1, 100000)
plt.scatter(x, y,alpha=0.1)
plt.show()
案例:绘制机器学习中经典数据集-鸢尾花
# 加载鸢尾花数据集
from sklearn import datasets
iris = datasets.load_iris()
iris.keys()
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names'])
#print(iris.DESCR)
iris.feature_names
['sepal length (cm)',
'sepal width (cm)',
'petal length (cm)',
'petal width (cm)']
iris.target
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
iris.target_names
array(['setosa', 'versicolor', 'virginica'], dtype='<U10')
X = iris.data[:,:2]
y = iris.target
y
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
# type(X)
X[:,1]
plt.scatter(X[:,0],X[:,1])
X[y==0].size
100
len(X[y==0][:,0])
50
X[y==0,0] #散点图的x轴 1是y轴
array([5.1, 4.9, 4.7, 4.6, 5. , 5.4, 4.6, 5. , 4.4, 4.9, 5.4, 4.8, 4.8,
4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5. ,
5. , 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5. , 5.5, 4.9, 4.4,
5.1, 5. , 4.5, 4.4, 5. , 5.1, 4.8, 5.1, 4.6, 5.3, 5. ])
绘制萼片维度的散点图
plt.scatter(X[y==0,0],X[y==0,1],color='r')
plt.scatter(X[y==1,0],X[y==1,1],color='g')
plt.scatter(X[y==2,0],X[y==2,1],color='b')
plt.scatter(X[y==0,0],X[y==0,1],color='r',marker='+')
plt.scatter(X[y==1,0],X[y==1,1],color='g',marker='x')
plt.scatter(X[y==2,0],X[y==2,1],color='b',marker='o')
花瓣维度的散点图
X = iris.data[:,2:]
X
array([[1.4, 0.2],
[1.4, 0.2],
[1.3, 0.2],
X[y==0,0]
array([1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4,
1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, 1.7, 1.5, 1. , 1.7, 1.9, 1.6,
1.6, 1.5, 1.4, 1.6, 1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 1.5, 1.3,
1.5, 1.3, 1.3, 1.3, 1.6, 1.9, 1.4, 1.6, 1.4, 1.5, 1.4])
plt.scatter(X[y==0,0],X[y==0,1],color='r',marker='o')
plt.scatter(X[y==1,0],X[y==1,1],color='g',marker='x')
plt.scatter(X[y==2,0],X[y==2,1],color='b',marker='+')
绘制多个图像
在matplotlib中, 一张图像是一个Figure对象. 在Figure对象中可以包含一个或者多个Axes对象。每个Axes(ax)对象都是一个拥有自己坐标系统的绘图区域。我们可以通过subplot()函数(子图)在一个Figure上创建多个图像(Axes)
import numpy as np
import pandas as pd
from pandas import Series , DataFrame
import matplotlib.pyplot as plt
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行一列的第一个图
plt.subplot(2,1,1)
plt.ylabel('y1 value')
plt.plot(x, y1, 'b--')
plt.subplot(2,1,2)
plt.ylabel('y2 value')
plt.plot(x, y2, 'r--')
plt.xlabel('x value')
plt.show()
# 子图位置可以进行简写
plt.subplot(221)
plt.plot(x,y1,'b--')
plt.subplot(222)
plt.plot(x,y2,'r--')
plt.subplot(223)
plt.plot(x,y1,'b*')
plt.subplot(224)
plt.plot(x,y2,'y--')
plt.show()
- 绘制子图的另外一种写法
# fig是画布, ax是数据
fig, ax = plt.subplots(2,2)
fig, ax = plt.subplots(2,2)
ax[0][0].plot(x, y1)
ax[0][1].plot(x, y2)
ax[1][0].plot(x, y1)
ax[1][1].plot(x, y2)
plt.show()
其他可视化绘图工具
- Seaborn
- Plotly
- pyecharts
- Bokeh
下面简单介绍一下Seaborn(选学)
官方地址:http://seaborn.pydata.org/index.html
Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。
Python中的一个制图工具库,可以制作出吸引人的、信息量大的统计图
-
在Matplotlib上构建,支持numpy和pandas的数据结构可视化。
-
多个内置主题及颜色主题
-
可视化单一变量、二维变量用于比较数据集中各变量的分布情况
-
可视化线性回归模型中的独立变量及不独立变量
案例演示
import numpy as np
import pandas as pd
from pandas import Series , DataFrame
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
df = sns.load_dataset('flights')
df.head()
df.shape
(144, 3)
# 对数据表进行重塑 第一个index是重塑的新表的索引名称是什么,第二个columns是重塑的新表的列名称是什么,
#一般来说就是被统计列的分组,第三个values就是生成新列的值应该是多少
df = df.pivot(index='month',columns='year',values='passengers')
df
plt.figure(figsize=(15, 8))
sns.heatmap(df)
plt.show()
df.plot(figsize=(10,6))
plt.show()
plt.figure(figsize=(15, 8))
sns.heatmap(df,annot=True,fmt='d')
plt.show()
s = df.sum()
#柱状图的第一种写法
plt.figure(figsize=(15, 8))
sns.barplot(s.index,s.values)
plt.show()
# 柱状图的第二种写法
plt.figure(figsize=(15, 8))
s.plot(kind='bar')
plt.show()
网友评论