04matplotlib

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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容