Matplotlib之Python可视化

PYTHON可视化

学习可视化的思路

  1. 了解统计学中的基本图形的特征,图形类型。图形是由那些要素构成的,哪种类型的图形适合展示哪种类型的数据。
  2. 学习绘制图形的API,熟悉各API的参数。
  3. 图形颜色和线条美化,选择适合所分析行业的颜色和线条,例如分析的行业是金融业就选择黑灰商务色,看起来严谨认真的线条和字体;分析的是教育行业就选择鲜活可爱的颜色主题和线条字体。这点需要对行业风格有认知,长期积累经验。

可视化图形原理

在数据可视化中,最基本的图形有6种:条形图、直方图、折线图、散点图、气泡图、饼图和雷达图。

饼图

用圆形及内圆扇形的角度来表示数值大小的图形,它主要用于表示一个样本(或总体)中各组成部分的数据占据全部数据比例,对于研究结构性问题十分有用。

饼图不是一种好操纵的图形,饼图最明显的两个局限在于它不能同时展示过多的数据类,也容易缩小不同类别的差距。使用饼图时的通常做法是将一个整圆切割为几个扇形,每个扇形代表一类数据,通过对不同扇形面积的比较来判断不同数据的差异。与条形图不同,人类很难区分出饼图中的细微差异,因此将一个饼图划分为过多的小扇形是没有意义的,同一个饼图中最多不要超过5个扇形。

直方图

用于展示分组数据分布的一种图形,它是用矩形的宽度和高度(即面积)来表示频数分布的。用横轴表示数据分组(宽度表示各组的组距),纵轴(高度)表示频数或频率。宽度和高度均有意义。由于分组数据具有连续性,直方图的各矩形通常是连续排列。主要展示数值型数据。

条形图(柱状图)

用条形的长度表示各类别频数的多少,其宽度(表示类别)则是固定不变的。条形图的矩形是分开排列。主要展示分类数据。

条形图的用途最广泛,它是最为简洁明了的基本图形。条形图用于二维数据之间的对比,利用条形的长短对比不同数据的差异。对于所有的中小规模数据集,条形图都工作得非常好;

箱线图(盒须图)

又称为盒须图、盒式图。是由一组数据的最大值(max),最小值(min),中位数(median),两个四分位数(quartiles)这五个特征值绘制而成的,它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较,用于连续型数据,

折线图

如果数值型数据是在不同时间上取得的,及时间序列数据,则可以绘制线图。主要用于反映现象随时间变化的特征。绘制线图时,时间一般绘在横轴,观测值绘在纵轴。

折线图同样用于对比二维数据,与条形图不同,它展示的重点不是不同数据的差异,而是数据整体的趋势走向,因此在所有涉及时间的数据都会运用折线图,对于金融数据来说,尤其是这样。

散点图

用二维坐标展示两个变量之间关系的一种图形。它是用坐标横轴代表变量x,纵坐标代表变量y,每组数据(x,y)在坐标系中用一个点表示。

散点图既可以用于对比二维数据,也可以用于对比三维数据。散点图注重多个维度之间的比较,如果拿不准数据集是否适合做回归分析,散点图可以帮助数据分析师看清数据的分布趋势。在聚类分析中,散点图同样能够帮助数据分析师直观了解不同类别的差别;

气泡图

可用于展示三个变量之间的关系,与散点图类似,绘制时将一个变量放在横轴,另一个变量放在纵轴,而第三个变量则用气泡的大小来表示。

气泡图是散点图的升级版,它不但能够在三维空间里体现出数据的分布,还可以通过气泡的大小体现不同数据的重要度。例如,在词频分析中,一个单词出现的次数越多,这个单词就越大,这就是一种气泡图的经典变形。

雷达图

是显示多个变量的常用图示方法,也称为蜘蛛图。利用雷达图也可以研究多个样本之间的相似程度。

它可以同时比较5维左右的数据,但不能超过6维。此外,雷达图也不能比较太多的数据。这种局限性使得雷达图的用处十分有限,但对于适合使用雷达图展示的数据来说,雷达图能最大限度地展示数据信息。

如何鉴别图形

一张好的图形应具有的基本特征:

  1. 显示数据
  2. 让读者把注意力集中在图形的内容上,而不是制作图形的程序上
  3. 避免歪曲
  4. 强调数据之间的比较
  5. 服务于一个明确的目的
  6. 有对图形的统计描述和文字说明

鉴别图形优劣的五条准则:

  1. 一张好的图形应当精心设计,有助于洞察问题的实质
  2. 一张好的图形应当使复杂的观点得到简明、确切、高效的阐述
  3. 一张好的图形应当在最短的时间内以最少的笔墨给读者提供最大量的信息
  4. 一张好图应当是多维的
  5. 一张好图应当表述数据的真实情况

从入门到精通:如何用图表做好数据分析?

知乎:https://www.zhihu.com/question/40903517/answer/130611180

CSDN:

数据图表制作的4个基本要素

可读性

精准性

客观性

统一性

图的构成要素

图表区

网格线

绘图区

轴标题

坐标轴

图表标题

数据标签

图例

误差线

趋势线

涨\跌柱线

Matplotlib

Matplotlib是一个综合库,用于在Python中创建静态,动画和交互式可视化。

# 安装matplotlib
pip install matplotlib

# 导入
import matplotlib.pyplot as plt
# 在当前页面中显示图片
%matplotlib inline

Matplotlib 的默认配置都允许用户自定义。你可以调整大多数的默认配置:图片大小和分辨率(dpi)、线宽、颜色、风格、坐标轴、坐标轴以及网格的属性、文字与字体属性等。不过,matplotlib 的默认配置在大多数情况下已经做得足够好,你可能只在很少的情况下才会想更改这些默认配置。

图表的构成

基本绘图流程

1.创建画布与创建子图

​ 第一部分主要作用是构建出一张空白的画布,并可以选择是否将整个画布划分为多个部分,方便在同一幅图上绘制多个图形的情况。最简单的绘图可以省 略第一部分,而后直接在默认的画布上进行图形绘制。

函数名称 函数作用
plt.figure 创建一个空白画布,可以指定画布大小,像素。
figure.add_subplot 创建并选中子图,可以指定子图的行数,列数,与选中图片编号。
import numpy as np
import matplotlib.pyplot as plt

# 创建画布
figure = plt.figure()

# 设置图表大小
plt.rcParams['figure.figsize'] = (8,6)
# 创建子图
plt.subplot()

# 绘制第1张子图:折线图
ax1 = plt.subplot(221)
plt.plot([1,2,3],[2,4,6])
# 绘制第2张子图:柱状图
ax2 = plt.subplot(222)
plt.bar([1,2,3],[2,4,6])
# 绘制第3张子图:散点图
ax3 = plt.subplot(223)
plt.scatter([1,3,5],[2,4,6])
# 绘制第4张子图:直方图
ax4 = plt.subplot(224)
plt.hist([2,2,2,3,4])
# 创建子图
fig, axes = plt.subplots(nrows=2,ncols=2,figsize=(10,8))
ax1,ax2,ax3,ax4 = axes.flatten()
# nrows表示行数,ncols表示列数,可以简写为plt.subplots(2,2),figsize参数设置图表尺寸为1000×800像素。
ax1.plot([1,2,3],[2,4,6]) # 绘制第一张子图
ax2.bar([1,2,3],[2,4,6]) # 绘制第二张子图
ax3.scatter([1,3,5],[2,4,6]) # 绘制第三张子图
ax4.hist([2,2,2,3,4]) # 绘制第四张子图

2.添加画布内容

​ 第二部分是绘图的主体部分。其中添加标题,坐标轴名称,绘制图形等步骤是并列的,没有先后顺序,可以先绘制图形,也可以先添加各类标签。但是添加图例一定要在绘制图形之后。

函数名称 函数作用
plt.title 在当前图形中添加标题,可以指定标题的名称、位置、颜色、字体 大小等参数。
plt.xlabel 在当前图形中添加x轴名称,可以指定位置、颜色、字体大小等参数。
plt.ylabel 在当前图形中添加y轴名称,可以指定位置、颜色、字体大小等参数。
plt.xlim 指定当前图形x轴的范围,只能确定一个数值区间,而无法使用字符 串标识。
plt.ylim 指定当前图形y轴的范围,只能确定一个数值区间,而无法使用字符 串标识。
plt.xticks 指定x轴刻度的数目与取值。
plt.yticks 指定y轴刻度的数目与取值。
plt.legend 指定当前图形的图例,可以指定图例的大小、位置、标签。

3.保存与展示图形

函数名称 函数作用
plt.savefig 保存绘制的图片,可以指定图片的分辨率、边缘的颜色等参数。
plt.show 在本机显示图形。

4.设置pyplot的动态rc参数

pyplot模块使用rc配置文件来自定义图形的各种默认属性,称为rc配置或rc参数。通过修改rc参数可以修改默认的属性,包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标和网络属性、文本、字体等。

matplotlib将默认参数配置保存在matplotlibrc文件中,通过修改配置文件,可修改图标的的缺省样式。

1.线条常用的rc参数
rc参数名称 解释 取值
lines.linewidth 线条宽度 取0-10之间的数值,默认为1.5。
lines.linestyle 线条样式 可取“-”“--”“-.”“ : ”四种。 默认为“-” 。
lines.marker 线条上点的形状 可取“o”“D”“h”“.”“ , ” “S”等20种,默认为None
lines.markersize 点的大小 取0-10之间的数值,默认为1。
# 修改rc参数
plt.rcParams['lines.linestyle'] = '-.'
plt.rcParams['lines.linewidth'] = 3
2.坐标轴常用的rc参数
rc参数名称 解释 取值
axes.facecolor 背景颜色 接收颜色简写字符。默认为“W”
axes.edgecolor 边线颜色 接收颜色简写字符。默认为“k”
axes.linewidth 轴线宽度 接收0~1的float。默认为0.8
axes.grid 添加网格 接收bool。默认为False
axes.titlesize 标题大小 接收‘small’,‘medium’,'large'。默认为‘large’
axes.labelsize 轴标大小 接收‘small’,‘medium’,'large'。默认为‘medium’
axes.lablelcolor 轴标颜色 接收颜色简写字符。默认为“k”
axes.spines. 添加坐标轴 接收bool。默认为True
axes.{x,y}margin 轴余留 接收float。默认为0.05

3.字体常用的rc参数

rc参数名称 解释 取值
font.family 字体族,每一族对应多种字体 接收serif、sans-serif、cursive、fantasy、monospace五种。默认为sans-serif
font.style 字体风格 接收normal(roman)、italic、oblique三种,默认为normal
font.variant 字体变化 接收normal或small-caps。默认为normal
font.widget 字体重量 接收normal、bold、bolder、lighter四种及100、200、…、900.默认为nomal
font.stretch 字体延伸
font.size 字体大小 接收float。默认为10
注意

​ 由于默认的pyplot字体并不支持中文字符的显示,因此需要通过设置font.sans-serif 参数改变绘图时的字体,使得图形可以正常显示中文。同时,由于更改字体后,会导致 坐标轴中的部分字符无法显示,因此需要同时更改axes.unicode_minus参数。

import matplotlib.pyplot as plt

# 用来正常显示中文标签,SimHei是黑体的英文名称
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决符号显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False

基本绘图

1).绘图核心API

# 绘制简单直线
import numpy as np
import matplotlib.pyplot as plt

# 绘制简单直线
x = np.array([1, 2, 3, 4, 5])
y = np.array([3, 6, 9, 12, 15])

# 绘制水平线、垂线
plt.axhline(y=6, ls=":", c="blue")  # 添加水平直线
plt.axvline(x=4, ls="-", c="red")  # 添加垂直直线

# 绘制多段垂线
plt.vlines([2, 3, 3.5],  # 垂线的x坐标值
           [10, 20, 30],  # 每条垂线起始y坐标
           [25, 35, 45])  # 每条垂线结束y坐标

plt.figure()        
plt.plot(x, y)
plt.savefig('./test2.jpg') # 保存图片
plt.show() # 显示图片,阻塞方法

2).设置线型、线宽

linestyle: 设置线型,常见取值有实线('-')、虚线('--')、点虚线('-.')、点线(':')

linewidth:线宽

color:颜色(red, blue, green)

alpha: 设置透明度(0~1之间)

格式化字符

字符 描述
'-' 实线样式
'--' 短横线样式
'-.' 点划线样式
':' 虚线样式
'.' 点标记
',' 像素标记
'o' 圆标记
'v' 倒三角标记
'^' 正三角标记
'<' 左三角标记
'>' 右三角标记
'1' 下箭头标记
'2' 上箭头标记
'3' 左箭头标记
'4' 右箭头标记
's' 正方形标记
'p' 五边形标记
'*' 星形标记
'h' 六边形标记 1
'H' 六边形标记 2
'+' 加号标记
'x' X 标记
'D' 菱形标记
'd' 窄菱形标记
`' '`
'_' 水平线标记

颜色的缩写

字符 颜色
'b' 蓝色
'g' 绿色
'r' 红色
'c' 青色
'm' 品红色
'y' 黄色
'k' 黑色
'w' 白色

示例:绘制正弦、余弦曲线,并设置线型、线宽、颜色、透明度

# 绘制正弦曲线
import numpy as np
import matplotlib.pyplot as plt
import math

x = np.arange(0, 2 * np.pi, 0.1)  # 以0.1为单位,生成0~6的数据
print(x)
y1 = np.sin(x)
y2 = np.cos(x)

# 绘制图形
plt.plot(x, y1, label="sin", linewidth=2)  # 实线,线宽2像素
plt.plot(x, y2, label="cos", linestyle="--", linewidth=4)  # 虚线,线宽4像素

plt.xlabel("x")  # x轴文字
plt.ylabel("y")  # y轴文字

# 设置坐标轴范围
plt.xlim(0, 2 * math.pi)
plt.ylim(-1, 2)

plt.title("sin & cos")  # 图标题
plt.legend()  # 图例
plt.show()

3).设置坐标轴范围

#x_limt_min:	<float> x轴范围最小值
#x_limit_max:	<float> x轴范围最大值
plt.xlim(x_limt_min, x_limit_max)
#y_limt_min:	<float> y轴范围最小值
#y_limit_max:	<float> y轴范围最大值
plt.ylim(y_limt_min, y_limit_max)

4).设置坐标刻度

#x_val_list: 	x轴刻度值序列
#x_text_list:	x轴刻度标签文本序列 [可选]
plt.xticks(x_val_list , x_text_list)
#y_val_list: 	y轴刻度值序列
#y_text_list:	y轴刻度标签文本序列 [可选]
plt.yticks(y_val_list , y_text_list)

绘制二次函数曲线

# 绘制二次函数曲线
import numpy as np
import matplotlib.pyplot as plt
import math

x = np.arange(-5, 5, 0.1)  # 以0.1为单位,生成-5~5的数据
print(x)
y = x ** 2

# 绘制图形
plt.plot(x, y, label="$y = x ^ 2$",
         linewidth=2,  # 线宽2像素
         color="red",  # 颜色
         alpha=0.5)  # 透明度

plt.xlabel("x")  # x轴文字
plt.ylabel("y")  # y轴文字

# 设置坐标轴范围
plt.xlim(-10, 10)
plt.ylim(-1, 30)

# 设置刻度
x_tck = np.arange(-10, 10, 2)
x_txt = x_tck.astype("U")
plt.xticks(x_tck, x_txt)

y_tck = np.arange(-1, 30, 5)
y_txt = y_tck.astype("U")
plt.yticks(y_tck, y_txt)

plt.title("square")  # 图标题
plt.legend(loc="upper right")  # 图例 upper right, center
plt.show()

5).设置坐标轴

坐标轴名:left / right / bottom / top

# 获取当前坐标轴字典,{'left':左轴,'right':右轴,'bottom':下轴,'top':上轴 }
ax = plt.gca()

# 获取其中某个坐标轴
axis = ax.spines['坐标轴名']

# 设置坐标轴的位置。 该方法需要传入2个元素的元组作为参数
# type: <str> 移动坐标轴的参照类型  一般为'data' (以数据的值作为移动参照值)
# val:  参照值
axis.set_position(('data', val))

# 设置坐标轴的颜色
# color: <str> 颜色值字符串
axis.set_color(color)
# 设置坐标轴格式

import matplotlib.pyplot as plt

ax = plt.gca()
axis_b = ax.spines['bottom']  # 获取下轴
axis_b.set_position(('data', 0))  # 设置下轴位置, 以数据作为参照值

axis_l = ax.spines['left']  # 获取左轴
axis_l.set_position(('data', 0))  # 设置左轴位置, 以数据作为参照值

ax.spines['top'].set_color('none')  # 设置顶部轴无色
ax.spines['right'].set_color('none')  # 设置右部轴无色

plt.show()

6)图例

# 显示两条曲线的图例,并测试loc属性
# 再绘制曲线时定义曲线的label
# label: <关键字参数 str> 支持LaTex排版语法字符串
plt.plot(xarray, yarray ... label='', ...)
# 设置图例的位置
# loc: <关键字参数> 制定图例的显示位置 (若不设置loc,则显示默认位置)
#	 ===============   =============
#    Location String   Location Code
#    ===============   =============
#    'best'            0
#    'upper right'     1
#    'upper left'      2
#    'lower left'      3
#    'lower right'     4
#    'right'           5
#    'center left'     6
#    'center right'    7
#    'lower center'    8
#    'upper center'    9
#    'center'          10
#    ===============   =============
plt.legend(loc='')

7)特殊点

# xarray: <序列> 所有需要标注点的水平坐标组成的序列
# yarray: <序列> 所有需要标注点的垂直坐标组成的序列
plt.scatter(xarray, yarray, 
           marker='', 		#点型 ~ matplotlib.markers
           s= , 			#大小
           edgecolor='', 	#边缘色
           facecolor='',	#填充色
           zorder=3			#绘制图层编号 (编号越大,图层越靠上)
)

示例:在二次函数图像中添加特殊点

# 绘制特殊点
plt.scatter(x_tck,  # x坐标数组
            x_tck ** 2,  # y坐标数组
            marker="s",  # 点形状 s:square
            s=40,  # 大小
            facecolor="blue",  # 填充色
            zorder=3)  # 图层编号

8)备注

# 在图表中为某个点添加备注。包含备注文本,备注箭头等图像的设置。
plt.annotate(
    r'$\frac{\pi}{2}$',			#备注中显示的文本内容
    xycoords='data',			#备注目标点所使用的坐标系(data表示数据坐标系)
    xy=(x, y),	 				#备注目标点的坐标
    textcoords='offset points',	#备注文本所使用的坐标系(offset points表示参照点的偏移坐标系)
    xytext=(x, y),				#备注文本的坐标
    fontsize=14,				#备注文本的字体大小
    arrowprops=dict()			#使用字典定义文本指向目标点的箭头样式
)

arrowprops参数使用字典定义指向目标点的箭头样式

#arrowprops字典参数的常用key
arrowprops=dict(
	arrowstyle='',		#定义箭头样式
    connectionstyle=''	#定义连接线的样式
)

箭头样式(arrowstyle)字符串如下

============   =============================================
Name           Attrs
============   =============================================
  '-'          None
  '->'         head_length=0.4,head_width=0.2
  '-['         widthB=1.0,lengthB=0.2,angleB=None
  '|-|'        widthA=1.0,widthB=1.0
  '-|>'        head_length=0.4,head_width=0.2
  '<-'         head_length=0.4,head_width=0.2
  '<->'        head_length=0.4,head_width=0.2
  '<|-'        head_length=0.4,head_width=0.2
  '<|-|>'      head_length=0.4,head_width=0.2
  'fancy'      head_length=0.4,head_width=0.4,tail_width=0.4
  'simple'     head_length=0.5,head_width=0.5,tail_width=0.2
  'wedge'      tail_width=0.3,shrink_factor=0.5
============   =============================================

连接线样式(connectionstyle)字符串如下

============   =============================================
Name           Attrs
============   =============================================
  'angle' 		angleA=90,angleB=0,rad=0.0
  'angle3' 		angleA=90,angleB=0`   
  'arc'			angleA=0,angleB=0,armA=None,armB=None,rad=0.0
  'arc3' 		rad=0.0
  'bar' 		armA=0.0,armB=0.0,fraction=0.3,angle=None
============   =============================================

示例:在二次函数图像中添加备注

# 设置备注
plt.annotate(
    r'$y = x ^ 2$',			#备注中显示的文本内容
    xycoords='data',			#备注目标点所使用的坐标系(data表示数据坐标系)
    xy=(4, 16),	 				#备注目标点的坐标 (4,16)
    textcoords='offset points',	#备注文本所使用的坐标系(offset points表示参照点的偏移坐标系)
    xytext=(20, 30),				#备注文本的坐标
    fontsize=14,				#备注文本的字体大小
    arrowprops=dict(
        arrowstyle="->", connectionstyle="angle3"
    )			#使用字典定义文本指向目标点的箭头样式
)

9)绘图风格

print(plt.style.available)

# 结果
['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']

# 切换风格
plt.style.use('Solarize_Light2')

高级绘图

1)plt对象支持的图类型
函数 说明
plt.plot(x,y,fmt) 坐标系
plt.boxplot(data,notch,position) 箱型图
plt.bar(left,height,width,bottom) 柱状图
plt.barh(width,bottom,left,height) 横向柱状图
plt.polar(theta,r) 极坐标系
plt.pie(data,explode) 饼图
plt.psd(x,NFFT=256,pad_to,Fs) 功率谱密度图
plt.specgram(x,NFFT=256,pad_to,F) 谱图
plt.cohere(x,y,NFFT=256,Fs) X-Y相关性函数
plt.scatter(x,y) 散点图
plt.step(x,y,where) 步阶图
plt.hist(x,bins,normed) 直方图

bar,barh,pie, scatter,hist,plot

2)散点图

​ 散点图(scatter diagram)又称为散点分布图,是以一个特征为横坐标,另一个特征为纵坐标,利用坐标点(散点)的分布形态反映特征间的统计关系的一种图形。

值是由点在图表中的位置表示,类别是由图表中的不同标记表示,通常用于比较跨类别的数据。

绘制散点图的相关API:

plt.scatter(
    x, 					# x轴坐标数组
    y,					# y轴坐标数组
    marker='', 			# 点型
    s=10,				# 大小
    color='',			# 颜色
    edgecolor='', 		# 边缘颜色
    facecolor='',		# 填充色
    zorder=''			# 图层序号
)

函数参数相关说明:

参数名称 描述
x,y 接收array,表示x轴和y轴对应的·数据。无默认值
s 接收数值或者一维array,指定点的大小,一维array表示每个点的大小。默认为None
c 接收颜色或者一堆array,指定点的颜色,一维array表示每个点的颜色。默认为None
marker 接收特定str,表示绘制的点的形状。默认为None
alpha 接收0~1的小数,表示点的透明度。默认为None

numpy.random提供了normal函数用于产生符合正态分布的随机数 。

n = 100
# 172:	期望值
# 10:	标准差
# n:	数字生成数量
x = np.random.normal(172, 20, n)
y = np.random.normal(60, 10, n)

案例:绘制平面散点图。

# 散点图示例
import matplotlib.pyplot as plt
import numpy as np

n = 40
# 期望值:期望值是该变量输出值的平均数
# 标准差:是反映一组数据离散程度最常用的一种量化形式,是表示精确度的重要指标
x = np.random.normal(172, 20 ,n ) # 期望值, 标准差, 生成数量
y = np.random.normal(60, 10, n) # 期望值, 标准差, 生成数量

x2 = np.random.normal(180, 20 ,n ) # 期望值, 标准差, 生成数量
y2 = np.random.normal(70, 10, n) # 期望值, 标准差, 生成数量

plt.figure("scatter", facecolor="lightgray")
plt.title("Scatter Demo")
plt.scatter(x, y, c="red", marker="D")
plt.scatter(x2, y2, c="blue", marker="v")

plt.xlim(100, 240)
plt.ylim(0, 100)
plt.show()

cmap颜色映射表参照附件:cmap颜色映射表

3)折线图

折线图(line chart)是一种将数据点按照顺序连接起来的图形。可以看作是将散点图,按照x轴坐标顺序连接起来的图形。

折线图的主要功能是查看因变量y随着自变量 x改变的趋势,最适合用于显示随时间(根据常用比例设置)而变化的连续数据。同时还可以看出数量的差异,增长趋势的变化。

plot函数

matplotlib.pyplot.plot(*args, **kwargs)

主要参数:

参数名称 说明
x,y 接收array。表示x轴和y轴对应的数据。无默认
color 接收特定string。指定线条的颜色。默认为None。
linestyle 接收特定string。指定线条类型。默认为“-”。'-.' , '--' , ':'
marker 接收特定string。表示绘制的点的类型。默认为None。
alpha 接收0-1的小数。表示点的透明度。默认为None。

Marker标记

color颜色

4)填充

以某种颜色自动填充两条曲线的闭合区域。

plt.fill_between(
	x,				# x轴的水平坐标
    sin_x,			# 下边界曲线上点的垂直坐标
    cos_x,			# 上边界曲线上点的垂直坐标
    sin_x<cos_x, 	# 填充条件,为True时填充
    color='', 		# 填充颜色
    alpha=0.2		# 透明度
)

案例:绘制两条曲线: sin_x = sin(x) cos_x = cos(x / 2) / 2 [0-8π]

import matplotlib.pyplot as plt
import numpy as np

n = 1000
x = np.linspace(0, 8 * np.pi, n)  # 返回指定间隔上的等距数字

sin_y = np.sin(x)  # 计算sin函数值
cos_y = np.cos(x / 2) / 2  # 计算cos函数值

plt.figure('Fill', facecolor='lightgray')
plt.title('Fill', fontsize=20)
plt.xlabel('x', fontsize=14)  # x轴标签
plt.ylabel('y', fontsize=14)  # y轴
plt.tick_params(labelsize=10)  # 刻度
plt.grid(linestyle=':')

plt.plot(x, sin_y, c='dodgerblue', label=r'$y=sin(x)$')
plt.plot(x, cos_y, c='orangered', label=r'$y=\frac{1}{2}cos(\frac{x}{2})$')

# 填充cos_y < sin_y的部分
plt.fill_between(x, cos_y, sin_y, cos_y < sin_y, color='dodgerblue', alpha=0.5)
# 填充cos_y > sin_y的部分
plt.fill_between(x, cos_y, sin_y, cos_y > sin_y, color='orangered', alpha=0.5)

plt.legend()
plt.show()
5)条形图(柱状图)

​ 条形图(bar chart)是用宽度相同的条形的高度或长短来表示数据多少的图形。条形图可以横置或纵置,纵置时也称为柱形图(column chart)。

​ 能够使人们一眼看出各个数据的大小。易于比较数据之间的差别。

绘制柱状图的相关API:

# 设置使中文显示完整
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.figure('Bar', facecolor='lightgray')
plt.bar(
	x,				# 水平坐标数组
    y,				# 柱状图高度数组
    width,			# 柱子的宽度
    color='', 		# 填充颜色
    label='',		#
    alpha=0.2		#
)

案例:先以柱状图绘制苹果12个月的销量,然后再绘制橘子的销量。

import matplotlib.pyplot as plt
import numpy as np

apples = np.array([30, 25, 22, 36, 21, 29, 20, 24, 33, 19, 27, 15])
oranges = np.array([24, 33, 19, 27, 35, 20, 15, 27, 20, 32, 20, 22])

plt.figure('Bar', facecolor='lightgray')
plt.title('Bar', fontsize=20)
plt.xlabel('Month', fontsize=14)
plt.ylabel('Price', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(axis='y', linestyle=':') # 生成网格

x = np.arange(len(apples))  # 产生均匀数组,长度等同于apples

plt.bar(x - 0.2,  # 横轴数据
       apples,  # 纵轴数据
       0.4,  # 柱体宽度
       color='dodgerblue',
       label='Apple')
plt.bar(x + 0.2,  # 横轴数据
       oranges,  # 纵轴数据
       0.4,  # 柱体宽度
       color='orangered', label='Orange', alpha=0.75)

plt.xticks(x, ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])

plt.legend() #显示图例
plt.show()
6)直方图

​ 直方图(Histogram)又称质量分布图,是统计报告图的一种,由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据所属类别,纵轴表示数量或者占比。

​ 用直方图可以比较直观地看出产品质量特性的分布状态,便于判断其总体质量分布情况。直方图可以发现分布表无法发现的数据模式、样本的频率分布和总体的分布。

绘制直方图相关API:

plt.hist(
    ['x', 'bins=None', 'range=None', 'density=None', 'weights=None', 'cumulative=False', 'bottom=None', "histtype='bar'", "align='mid'", "orientation='vertical'", 'rwidth=None', 'log=False', 'color=None', 'label=None', 'stacked=False', 'normed=None', '*', 'data=None', '**kwargs'],
)
参数 描述
x 列表对象,ndarray对象
bins 数据组(bin)数
range 数据组的上界和下界
normed 规范化为整数1
weights x轴上每个值的权重
cumulative 每个数据组包含较低组别的计数
histtype 选项:bar,barstacked,step,stepfilled
align 选项:left,mid,right
orientation 选项:horizontal,vertical
rwidth 条块的相对宽度
log 对数刻度
color 每个数据集的颜色
label 标签所用的字符串或者字符串序列
stacked 堆叠多个数据集

案例:绘制统计直方图显示图片像素亮度分布:

import numpy as np
import matplotlib.pyplot as plt
import scipy.misc as sm

img = sm.imread('../data/forest.jpg', True)
print(img.shape)

pixes = img.ravel()
plt.figure('Image Hist', facecolor='lightgray')
plt.title('Image Hist', fontsize=18)
plt.xticks(np.linspace(0, 255, 11))
plt.hist(x=pixes, bins=10, color='dodgerblue', range=(0, 255), edgecolor='white', normed=False)
plt.show()
7)饼图

​ 饼图(Pie Graph)是将各项的大小与各项总和的比例显示在一张 “饼”中,以“饼”的大小来确定 每一项的占比。

​ 饼图可以比较清楚地反映出部分与 部分、部分与整体之间的比例关系, 易于显示每组数据相对于总数的大小,而且显现方式直观。

绘制饼状图的基本API:

plt.pie(
    values, 		# 值列表		
    spaces, 		# 扇形之间的间距列表
    labels, 		# 标签列表
    colors, 		# 颜色列表
    '%d%%',			# 标签所占比例格式
	shadow=True, 	# 是否显示阴影
    startangle=90	# 逆时针绘制饼状图时的起始角度
    radius=1		# 半径
)

案例:绘制饼状图显示6门编程语言的流行程度:

import matplotlib.pyplot as plt
import numpy as np

plt.figure('pie', facecolor='lightgray')
plt.title('Pie', fontsize=20)
# 整理数据
values = [15, 13.3, 8.5, 7.3, 4.62, 51.28]
spaces = [0.05, 0.01, 0.01, 0.01, 0.01, 0.01]
labels = ['Java', 'C', 'Python', 'C++', 'VB', 'Other']
colors = ['dodgerblue', 'orangered', 'limegreen', 'violet', 'gold','blue']
# 等轴比例
plt.axis('equal')
plt.pie(
    values,  # 值列表
    spaces,  # 扇形之间的间距列表
    labels,  # 标签列表
    colors,  # 颜色列表
    '%d%%',  # 标签所占比例格式
    shadow=True,  # 是否显示阴影
    startangle=90,  # 逆时针绘制饼状图时的起始角度
    radius=1  # 半径
)
plt.legend()
plt.show()
posted @ 2021-07-14 15:29  小石小石摩西摩西  阅读(552)  评论(0编辑  收藏  举报