通过这个教程,你将收获以下知识:
* matplotlib 及环境配置
* 数据图的组成结构,与 matplotlib 对应的名称
* 常见的数据绘图类型,与绘制方法
您可能需要以下的准备与先修知识:
* Python开发环境及matplotlib工具包
* Python基础语法
* Python numpy 包使用
linux可以通过以下方式安装matplotlib
sudo pip install numpy
sudo pip install scipy
sudo pip install matplotlib
windows 可以使用anaconda
数据最好用series dataframe如果有报错,用’.values’转换成numpy
通常,使用 numpy 组织数据, 使用 matplotlib API 进行数据图像绘制。 一幅数据图基本上包括如下结构:
其他的还有图形文本 (Text)、注解 (Annotate)等其他描述
下面以常规图为例,详细记录作图流程及技巧。按照绘图结构,可将数据图的绘制分为如下几个步骤:
会用到 matplotlib.pyplot、pylab 和 numpy
#coding:utf-8
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
numpy 常用来组织源数据:
# 定义数据部分
x = np.arange(0., 10, 0.2)
y1 = np.cos(x)
y2 = np.sin(x)
y3 = np.sqrt(x)
#x = all_df['house_age']
#y = all_df['house_price']
使用 plot 函数直接绘制上述函数曲线,可以通过配置 plot 函数参数调整曲线的样式、粗细、颜色、标记等:
# 绘制 3 条函数曲线
# $y=\sqrt{x}$
plt.rcParams["figure.figsize"] = (12,8)
plt.plot(x, y1, color='blue', linewidth=1.5, linestyle='-', marker='.', label=r'$y = cos{x}$')
plt.plot(x, y2, color='green', linewidth=1.5, linestyle='-', marker='*', label=r'$y = sin{x}$')
plt.plot(x, y3, color='m', linewidth=1.5, linestyle='-', marker='x', label=r'$y = \sqrt{x}$')
主要是color参数:
* r 红色
* g 绿色
* b 蓝色
* c cyan
* m 紫色
* y 土黄色
* k 黑色
* w 白色
linestyle 参数主要包含虚线、点化虚线、粗虚线、实线,如下:
marker参数设定在曲线上标记的特殊符号,以区分不同的线段。常见的形状及表示符号如下图所示:
可通过如下代码,移动坐标轴 spines
# 坐标轴上移
ax = plt.subplot(111)
#ax = plt.subplot(2,2,1)
ax.spines['right'].set_color('none') # 去掉右边的边框线
ax.spines['top'].set_color('none') # 去掉上边的边框线
# 移动下边边框线,相当于移动 X 轴
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
# 移动左边边框线,相当于移动 y 轴
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
可通过如下代码,设置刻度尺间隔 lim、刻度标签 ticks
# 设置 x, y 轴的刻度取值范围
plt.xlim(x.min()*1.1, x.max()*1.1)
plt.ylim(-1.5, 4.0)
# 设置 x, y 轴的刻度标签值
plt.xticks([2, 4, 6, 8, 10], [r'two', r'four', r'six', r'8', r'10'])
plt.yticks([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0],
[r'-1.0', r'0.0', r'1.0', r'2.0', r'3.0', r'4.0'])
([,
,
,
,
,
],
)
可通过如下代码,设置 X、Y 坐标轴和标题:
# 设置标题、x轴、y轴
plt.title('title', fontsize=19)
plt.xlabel('x', fontsize=18, labelpad=88.8)
plt.ylabel('y', fontsize=18, labelpad=12.5)
Text(0,0.5,'y')
可通过如下代码,在数据图中添加文字描述 text:
plt.text(0.8, 0.9, r'$x \in [0.0, \ 10.0]$', color='k', fontsize=15)
plt.text(0.8, 0.8, r'$y \in [-1.0, \ 4.0]$', color='k', fontsize=15)
Text(0.8,0.8,'$y \\in [-1.0, \\ 4.0]$')
可通过如下代码,在数据图中给特殊点添加注解 annotate:
# 特殊点添加注解
plt.scatter([8,],[np.sqrt(8),], 50, color ='m') # 使用散点图放大当前点
plt.annotate(r'$2\sqrt{2}$', xy=(8, np.sqrt(8)), xytext=(8.5, 2.2), fontsize=16, color='#090909', arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=0.1', color='#090909'))
可使用如下两种方式,给绘图设置图例:
* 1: 在 plt.plot 函数中添加 label 参数后,使用 plt.legend(loc=’up right’)
* 2: 不使用参数 label, 直接使用如下命令:
plt.legend([‘cos(x)’, ‘sin(x)’, ‘sqrt(x)’], loc=’upper right’)
可使用如下代码,给绘图设置网格线:
# 显示网格线
plt.grid(True)
plt.show() # 显示
#savefig('../figures/plot3d_ex.png',dpi=48) # 保存,前提目录存在
#coding:utf-8
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
# 定义数据部分
x = np.arange(0., 10, 0.2)
y1 = np.cos(x)
y2 = np.sin(x)
y3 = np.sqrt(x)
# 绘制 3 条函数曲线
plt.plot(x, y1, color='blue', linewidth=1.5, linestyle='-', marker='.', label=r'$y = cos{x}$')
plt.plot(x, y2, color='green', linewidth=1.5, linestyle='-', marker='*', label=r'$y = sin{x}$')
plt.plot(x, y3, color='m', linewidth=1.5, linestyle='-', marker='x', label=r'$y = \sqrt{x}$')
# 坐标轴上移
ax = plt.subplot(111)
ax.spines['right'].set_color('none') # 去掉右边的边框线
ax.spines['top'].set_color('none') # 去掉上边的边框线
# 移动下边边框线,相当于移动 X 轴
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
# 移动左边边框线,相当于移动 y 轴
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
# 设置 x, y 轴的取值范围
plt.xlim(x.min()*1.1, x.max()*1.1)
plt.ylim(-1.5, 4.0)
# 设置 x, y 轴的刻度值
plt.xticks([2, 4, 6, 8, 10], [r'2', r'4', r'6', r'8', r'10'])
plt.yticks([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0],
[r'-1.0', r'0.0', r'1.0', r'2.0', r'3.0', r'4.0'])
# 添加文字
plt.text(0.8, 0.8, r'$x \in [0.0, \ 10.0]$', color='k', fontsize=15)
plt.text(0.8, 0.9, r'$y \in [-1.0, \ 4.0]$', color='k', fontsize=15)
# 特殊点添加注解
plt.scatter([8,],[np.sqrt(8),], 50, color ='m') # 使用散点图放大当前点
plt.annotate(r'$2\sqrt{2}$', xy=(8, np.sqrt(8)), xytext=(8.5, 2.2), fontsize=16, color='#090909', arrowprops=dict(arrowstyle='->', connectionstyle='arc3, rad=0.1', color='#090909'))
# 设置标题、x轴、y轴
plt.title(r'$the \ function \ figure \ of \ cos(), \ sin() \ and \ sqrt()$', fontsize=19)
plt.xlabel(r'$the \ input \ value \ of \ x$', fontsize=18, labelpad=88.8)
plt.ylabel(r'$y = f(x)$', fontsize=18, labelpad=12.5)
# 设置图例及位置
plt.legend(loc='up right')
# plt.legend(['cos(x)', 'sin(x)', 'sqrt(x)'], loc='up right')
# 显示网格线
plt.grid(True)
# 显示绘图
plt.show()
详情资料这里
x = np.arange(-5,5,0.1)
y = x ** 2
plt.plot(x,y)
[]
# 对数据做分桶的时候用
x = np.random.normal(size=1000)
plt.hist(x, bins=10)
(array([ 1., 13., 57., 144., 287., 241., 160., 58., 35., 4.]),
array([-3.57006611, -2.87554624, -2.18102637, -1.4865065 , -0.79198663,
-0.09746676, 0.59705311, 1.29157298, 1.98609285, 2.68061272,
3.37513259]),
)
plt.rcParams["figure.figsize"] = (8,8)
x = np.random.normal(size=1000)
y = np.random.normal(size=1000)
plt.scatter(x,y)
np.random.seed(2) #设置随机种子
df = pd.DataFrame(np.random.rand(5,4), columns=['A', 'B', 'C', 'D'])#先生成0-1之间的5*4维度数据,再装入4列DataFrame中
df.boxplot() #也可用plot.box()
plt.show()
处理异常值时与3 σ σ 标准的异同:统计边界是否受异常值影响、容忍度的大小
箱子的上边界和下边界(蓝色部分):Q3 百分之75的分位数,Q1百分之25分位数
两条黑线:上边缘(Q3+1.5*IQR/“箱子高度”)、下边缘(Q1-1.5*IQR/“箱子高度”)、IQR=Q3-Q1,IQR为箱子的高度
两条黑线为临界值/边缘值,如果出现在黑线以外的是小概率事件,可以把它当做异常值。
大多用于表示一维的数据,中间的两条线没意义
参考文献:
七月在线课件