# 数据分析三剑客之matplotlib（三）

#### 填充

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


n = 1000
x = np.linspace(0, 8 * np.pi, n)
sin_y = np.sin(x)
cos_y = np.cos(x / 2) / 2
mp.figure('Fill', facecolor='lightgray')
mp.title('Fill', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
mp.plot(x, sin_y, c='dodgerblue',
label=r'$y=sin(x)$')
mp.plot(x, cos_y, c='orangered',
label=r'$y=\frac{1}{2}cos(\frac{x}{2})$')
mp.fill_between(x, cos_y, sin_y, cos_y < sin_y,
color='dodgerblue', alpha=0.5)
mp.fill_between(x, cos_y, sin_y, cos_y > sin_y,
color='orangered', alpha=0.5)
mp.legend()
mp.show()


#### 条形图（柱状图）

mp.figure('Bar', facecolor='lightgray')
mp.bar(
x,				# 水平坐标数组
y,				# 柱状图高度数组
width,			# 柱子的宽度
color='', 		# 填充颜色
label='',		#
alpha=0.2		#
)


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])
mp.figure('Bar'  , facecolor='lightgray')
mp.title('Bar', font size=20)
mp.xlabel('Month', fontsize=14)
mp.ylabel('Price', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(axis='y', linestyle=':')
mp.ylim((0, 40))
x = np.arange(len(apples))
mp.bar(x-0.2, apples, 0.4, color='dodgerblue',label='Apple')  #往左移0.2
mp.bar(x + 0.2, oranges, 0.4, color='orangered',label='Orange', alpha=0.75) #往右移0.2
mp.xticks(x, [
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])
mp.legend()
mp.show()


#### 饼图

mp.pie(
values, 		# 值列表
spaces, 		# 扇形之间的间距列表
labels, 		# 标签列表
colors, 		# 颜色列表
'%d%%',			# 标签所占比例格式
startangle=90	# 逆时针绘制饼状图时的起始角度
)


mp.figure('pie', facecolor='lightgray')
#整理数据
values = [26, 17, 21, 29, 11]
spaces = [0.05, 0.01, 0.01, 0.01, 0.01]
labels = ['Python', 'JavaScript',
'C++', 'Java', 'PHP']
colors = ['dodgerblue', 'orangered',
'limegreen', 'violet', 'gold']
mp.figure('Pie', facecolor='lightgray')
mp.title('Pie', fontsize=20)
# 等轴比例
mp.axis('equal')
mp.pie(
values, 		# 值列表
spaces, 		# 扇形之间的间距列表
labels, 		# 标签列表
colors, 		# 颜色列表
'%d%%',			# 标签所占比例格式
startanle=90	# 逆时针绘制饼状图时的起始角度
)


#### 等高线图

cntr = mp.contour(
x, 					# 网格坐标矩阵的x坐标 （2维数组）
y, 					# 网格坐标矩阵的y坐标 （2维数组）
z, 					# 网格坐标矩阵的z坐标 （2维数组）
8, 					# 把等高线绘制成8部分
colors='black',		# 等高线的颜色
linewidths=0.5		# 线宽
)
# 为等高线图添加高度标签
mp.clabel(cntr, inline_spacing=1, fmt='%.1f',
fontsize=10)
mp.contourf(x, y, z, 8, cmap='jet')



n = 1000
# 生成网格化坐标矩阵
x, y = np.meshgrid(np.linspace(-3, 3, n),
np.linspace(-3, 3, n))
# 根据每个网格点坐标，通过某个公式计算z高度坐标
z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)
mp.figure('Contour', facecolor='lightgray')
mp.title('Contour', fontsize=20)
mp.xlabel('x', fontsize=14)
mp.ylabel('y', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 绘制等高线图
mp.contourf(x, y, z, 8, cmap='jet')
cntr = mp.contour(x, y, z, 8, colors='black',
linewidths=0.5)
# 为等高线图添加高度标签
mp.clabel(cntr, inline_spacing=1, fmt='%.1f',
fontsize=10)
mp.show()


#### 热成像图

1 2 3
4 5 6
7 8 9

# 把矩阵z图形化，使用cmap表示矩阵中每个元素值的大小
# origin: 坐标轴方向
#    upper: 缺省值，原点在左上角
#    lower: 原点在左下角
mp.imshow(z, cmap='jet', origin='low')


mp.colorbar()


#### 3D图像绘制

matplotlib支持绘制三维曲面。若希望绘制三维曲面，需要使用axes3d提供的3d坐标系。

from mpl_toolkits.mplot3d import axes3d
ax3d = mp.gca(projection='3d')   # class axes3d


matplotlib支持绘制三维点阵、三维曲面、三维线框图：

ax3d.scatter(..)		# 绘制三维点阵
ax3d.plot_surface(..)	# 绘制三维曲面
ax3d.plot_wireframe(..)	# 绘制三维线框图


3d散点图的绘制相关API：

ax3d.scatter(
x, 				# x轴坐标数组
y,				# y轴坐标数组
z,				# z轴坐标数组
marker='', 		# 点型
s=10,			# 大小
zorder='',		# 图层序号
color='',		# 颜色
edgecolor='', 	# 边缘颜色
facecolor='',	# 填充色
c=v,			# 颜色值 根据cmap映射应用相应颜色
cmap=''			#
)


n = 1000
x = np.random.normal(0, 1, n)
y = np.random.normal(0, 1, n)
z = np.random.normal(0, 1, n)
d = np.sqrt(x ** 2 + y ** 2 + z ** 2)
mp.figure('3D Scatter')
ax = mp.gca(projection='3d')  # 创建三维坐标系
mp.title('3D Scatter', fontsize=20)
ax.set_xlabel('x', fontsize=14)
ax.set_ylabel('y', fontsize=14)
ax.set_zlabel('z', fontsize=14)
mp.tick_params(labelsize=10)
ax.scatter(x, y, z, s=60, c=d, cmap='jet_r', alpha=0.5)
mp.show()


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y6oops4Z-1584689205378)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1580881848516.png)]

3d平面图的绘制相关API：

ax3d.plot_surface(
x, 					# 网格坐标矩阵的x坐标 （2维数组）
y, 					# 网格坐标矩阵的y坐标 （2维数组）
z, 					# 网格坐标矩阵的z坐标 （2维数组）
rstride=30,			# 行跨距
cstride=30, 		# 列跨距
cmap='jet'			# 颜色映射
)


n = 1000
# 生成网格化坐标矩阵
x, y = np.meshgrid(np.linspace(-3, 3, n),
np.linspace(-3, 3, n))
# 根据每个网格点坐标，通过某个公式计算z高度坐标
z = (1 - x/2 + x**5 + y**3) * np.exp(-x**2 - y**2)
mp.figure('3D', facecolor='lightgray')

ax3d = mp.gca(projection='3d')
mp.title('3D', fontsize=20)
ax3d.set_xlabel('x', fontsize=14)
ax3d.set_ylabel('y', fontsize=14)
ax3d.set_zlabel('z', fontsize=14)
mp.tick_params(labelsize=10)
# 绘制3D平面图
# rstride: 行跨距
# cstride: 列跨距
ax3d.plot_surface(x,y,z,rstride=30,cstride=30, cmap='jet')


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T9t4CkxE-1584689205378)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1580882250729.png)]

# 绘制3D平面图
# rstride: 行跨距
# cstride: 列跨距
ax3d.plot_wireframe(x,y,z,rstride=30,cstride=30,
linewidth=1, color='dodgerblue')


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dX8wifFD-1584689205379)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\1580882304031.png)]

#### 极坐标系

mp.figure("Polar", facecolor='lightgray')
mp.gca(projection='polar')
mp.title('Porlar', fontsize=20)
mp.xlabel(r'$\theta$', fontsize=14)
mp.ylabel(r'$\rho$', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
mp.show()


#准备数据
t = np.linspace(0, 4*np.pi, 1000)
r = 0.8 * t
mp.plot(t, r)
mp.show()


x = np.linspace(0, 6*np.pi, 1000)
y = 3*np.sin(6*x)
mp.plot(x, y)


#### 简单动画

matplotlib提供了方法用于处理简单动画的绘制。定义update函数用于即时更新图像。

import matplotlib.animation as ma
#定义更新函数行为
def update(number):
pass
# 每隔10毫秒执行一次update更新函数，作用于mp.gcf()当前窗口对象
# mp.gcf()：	获取当前窗口
# update：	更新函数
# interval：	间隔时间（单位：毫秒）
anim = ma.FuncAnimation(mp.gcf(), update, interval=10)
mp.show()


#自定义一种可以存放在ndarray里的类型，用于保存一个球
ball_type = np.dtype([
('position', float, 2),  # 位置(水平和垂直坐标)
('size', float, 1),      # 大小
('growth', float, 1),    # 生长速度
('color', float, 4)])    # 颜色(红、绿、蓝和透明度)

#随机生成100个点对象
n = 100
balls = np.zeros(100, dtype=ball_type)
balls['position']=np.random.uniform(0, 1, (n, 2))
balls['size']=np.random.uniform(40, 70, n)
balls['growth']=np.random.uniform(10, 20, n)
balls['color']=np.random.uniform(0, 1, (n, 4))

mp.figure("Animation", facecolor='lightgray')
mp.title("Animation", fontsize=14)
mp.xticks
mp.yticks(())

sc = mp.scatter(
balls['position'][:, 0],
balls['position'][:, 1],
balls['size'],
color=balls['color'], alpha=0.5)

#定义更新函数行为
def update(number):
balls['size'] += balls['growth']
#每次让一个气泡破裂，随机生成一个新的
boom_ind = number % n
balls[boom_ind]['size']=np.random.uniform(40, 70, 1)
balls[boom_ind]['position']=np.random.uniform(0, 1, (1, 2))
# 重新设置属性
sc.set_sizes(balls['size'])
sc.set_offsets(balls['position'])

# 每隔30毫秒执行一次update更新函数，作用于mp.gcf()当前窗口对象
# mp.gcf()：	获取当前窗口
# update：		更新函数
# interval：	间隔时间（单位：毫秒）
anim = ma.FuncAnimation(mp.gcf(), update, interval=30)
mp.show()


import matplotlib.animation as ma
#定义更新函数行为
def update(data):
t, v = data
...
pass

def generator():
yield t, v

# 每隔10毫秒将会先调用生成器，获取生成器返回的数据，
# 把生成器返回的数据交给并且调用update函数，执行更新图像函数
anim = ma.FuncAnimation(mp.gcf(), update, generator,interval=10)


mp.figure("Signal", facecolor='lightgray')
mp.title("Signal", fontsize=14)
mp.xlim(0, 10)
mp.ylim(-3, 3)
mp.grid(linestyle='--', color='lightgray', alpha=0.5)
pl = mp.plot([], [], color='dodgerblue', label='Signal')[0]
pl.set_data([],[])

x = 0

def update(data):
t, v = data
x, y = pl.get_data()
x.append(t)
y.append(v)
#重新设置数据源
pl.set_data(x, y)
#移动坐标轴
if(x[-1]>10):
mp.xlim(x[-1]-10, x[-1])

def y_generator():
global x
y = np.sin(2 * np.pi * x) * np.exp(np.sin(0.2 * np.pi * x))
yield (x, y)
x += 0.05

anim = ma.FuncAnimation(mp.gcf(), update, y_generator, interval=20)
mp.tight_layout()
mp.show()


### 加载文件

numpy提供了函数用于加载逻辑上可被解释为二维数组的文本文件，格式如下：

数据项1 <分隔符> 数据项2 <分隔符> ... <分隔符> 数据项n

AA,AA,AA,AA,AA
BB,BB,BB,BB,BB
...

AA:AA:AA:AA:AA
BB:BB:BB:BB:BB
...


import numpy as np
# 直接读取该文件并且获取ndarray数组对象
# 返回值：
#     unpack=False：返回一个二维数组
#     unpack=True： 多个一维数组
'../aapl.csv',			# 文件路径
delimiter=',',			# 分隔符
usecols=(1, 3),			# 读取1、3两列 （下标从0开始）
unpack=False,			# 是否按列拆包
dtype='U10, f8',		# 制定返回每一列数组中元素的类型
converters={1:func}		# 转换器函数字典
)


import numpy as np
import datetime as dt
# 日期转换函数
def dmy2ymd(dmy):
dmy = str(dmy, encoding='utf-8')
time = dt.datetime.strptime(dmy, '%d-%m-%Y').date()
t = time.strftime('%Y-%m-%d')
return t
dates, opening_prices,highest_prices, \
'../data/aapl.csv',		# 文件路径
delimiter=',',			# 分隔符
usecols=(1, 3, 4, 5, 6),			# 读取1、3两列 （下标从0开始）
unpack=True,
dtype='M8[D], f8, f8, f8, f8',		# 制定返回每一列数组中元素的类型
converters={1:dmy2ymd})


1. 绘制dates与收盘价的折线图：
import numpy as np
import datetime as dt
import matplotlib.pyplot as mp
import matplotlib.dates as md

# 绘制k线图，x为日期
mp.figure('APPL K', facecolor='lightgray')
mp.title('APPL K')
mp.xlabel('Day', fontsize=12)
mp.ylabel('Price', fontsize=12)

#拿到坐标轴
ax = mp.gca()
#设置主刻度定位器为周定位器（每周一显示主刻度文本）
ax.xaxis.set_major_locator( md.WeekdayLocator(byweekday=md.MO) )
ax.xaxis.set_major_formatter(md.DateFormatter('%d %b %Y')) #%Y/%m/%d
#设置次刻度定位器为日定位器
ax.xaxis.set_minor_locator(md.DayLocator())
mp.tick_params(labelsize=8)
dates = dates.astype(md.datetime.datetime)

mp.plot(dates, opening_prices, color='dodgerblue',
linestyle='-')
mp.gcf().autofmt_xdate() # 获取当前窗口+自动格式化信息
mp.show()



06-22 3万+

06-13 367

03-28 1万+

10-13 218

11-27 1万+

11-18

01-10 7736

05-03 3万+

01-10 9689

06-20 383

05-04 7211

09-27

01-20 297

04-13

04-19

02-18 2万+

07-01 421

04-24 3457

07-10 1万+

04-14 61万+

03-13 15万+

03-12 2427

02-28 1万+

03-01 14万+

03-08 1万+

03-08 7万+

03-10 13万+

03-10 19万+

03-12 12万+

#### 如果你是老板，你会不会踢了这样的员工？

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客