import numpy as np
import matplotlib.pyplot as mp
n = 1000
x = np.linspace(0,8*np.pi,n)
sin_x = np.sin(x)
cos_x = np.cos(x/2)/2
mp.figure('Fill',facecolor='red') # 填充线 背景颜色
mp.title('Fill',fontsize=18) # 标题
mp.grid(linestyle=":") # 网格线
mp.plot(x,sin_x,color="dodgerblue",label="sin(x)") # sinx线的颜色
mp.plot(x,cos_x,color="orangered",label='cos(x)') # cosx线的颜色
# 绘制填充
mp.fill_between(x,sin_x,cos_x,sin_x>cos_x,color="pink",alpha=0.5)
mp.fill_between(x,sin_x,cos_x,sin_x<cos_x,color="red",alpha=0.5)
mp.legend() # 图例
mp.show()
绘制柱状图
import matplotlib.pyplot as mp
import numpy as np
apples = np.array([20,45,26,89,12,58,96]) # 苹果
orange = np.array([15,25,78,89,56,96,53]) # 桔子
mp.figure('Bar Chart',facecolor='lightgray') # 背景
mp.title('Bar Chart',fontsize = 18) # 标题
mp.grid(linestyle=':',axis='y') # 网格线
mp.xlabel('Date',fontsize=14) # x轴
mp.ylabel('Volume',fontsize=14) # y轴
x = np.arange(apples.size) # x轴个数
# mp.bar(x,apples,0.8,label='Apples',color='pink') # 画条形图
# # x轴个数
# mp.bar(x,orange,0.8,label='Oranges',color='red') # 画条形图
mp.bar(x+0.2,apples,0.4,label='Apples',color='pink') # 画条形图
# x轴个数
mp.bar(x-0.2,orange,0.4,label='Oranges',color='red') # 画条形图
# 优化刻度
mp.xticks(x,['Jan','Feb','Mar','Apr','May','Jun','Jul'])
mp.legend() # 图例
mp.show()
饼状图
import matplotlib.pyplot as mp
import numpy as np
# 饼状图
# 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='lightgrey') # 背景
mp.title('Pie',fontsize=20) # 标题
mp.axis('equal') # 等轴比例
mp.pie( # 绘图
values,
spaces,
labels,
colors,
'%.1f%%', # 格式化输出
shadow=True # 加阴影
)
mp.legend() # 显示图例
mp.show()
等高线图
import matplotlib.pyplot as mp
import numpy as np
n = 1000
# 生成网格化坐标矩阵
x,y = np.meshgrid(np.linspace(-3,3,n), # 二维的矩阵x坐标点
np.linspace(-3,3,n)) # 二维的矩阵的y坐标点
# 根据每个网格点坐标,通过某个公式计算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='pink',linewidths=0.5)
# 为等高线添加高度标签
mp.clabel(cntr,inline_spacing=1,fmt="%.1f",fontsize=10)
mp.show()
3D图像绘制
import matplotlib.pyplot as mp
import numpy as np
from mpl_toolkits.mplot3d import axes3d
import random
# 三维散点图
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()
自定义3D
import matplotlib.pyplot as mp
import numpy as np
from mpl_toolkits.mplot3d import axes3d
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)
ax3d.plot_surface(x,y,z,rstride=30,cstride=30, cmap='jet')
mp.show()
绘制线宽3D
import matplotlib.pyplot as mp
import numpy as np
from mpl_toolkits.mplot3d import axes3d
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)
ax3d.plot_wireframe(x,y,z,rstride=30,cstride=30,linewidth=1,
color='pink')
mp.show()
简单动画
import numpy as np
import matplotlib.pyplot as mp
import matplotlib.animation as ma
def update(number):
print(number)
mp.figure('Animation')
anim = ma.FuncAnimation(mp.gcf(),update,interval=1000)
mp.show()
案例
import matplotlib.pyplot as mp
import matplotlib.animation as ma
import numpy as np
ball_type = np.dtype([
('position', float, 2), # 位置(水平和垂直坐标)
('size', float, 1), # 大小
('growth', float, 1), # 生长速度
('color', float, 4)]) # 颜色(红、绿、蓝和透明度)
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()
绘制信号曲线:y=sin(2 * π * t) * exp(sin(0.2 * π * t))
import matplotlib.pyplot as mp
import numpy as np
import matplotlib.animation as ma
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()
import matplotlib.pyplot as mp
import numpy as np
import datetime as dt
import matplotlib.dates as md
# 日期转换函数
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,lowerst_prices,closing_pirce =np.loadtxt('/home/tarena/aid1907/data/day03/aapl.csv',
delimiter=',',
usecols=(1,3,4,5,6),
dtype='M8[D],f8,f8,f8,f8',
unpack=True,
converters={1:dmy2ymd})
# print(dates)
# 画图
mp.figure('AAPL',facecolor='lightgray')
mp.title('AAPL',fontsize=18)
mp.grid(linestyle=':')
mp.xlabel('Date',fontsize=14)
mp.ylabel('Closing Price',fontsize=14)
# 设置刻度定位器
ax = mp.gca()
ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday=md.MO))
ax.xaxis.set_minor_locator(md.DayLocator())
ax.xaxis.set_major_formatter(md.DateFormatter('%Y/%m/%d'))
mp.plot(dates,closing_pirce,color='pink',
linewidth=2,
linestyle='--',
label='closing')
mp.gcf().autofmt_xdate() # 刻度为斜线
mp.legend()
mp.show()