pip install matplotlib
一、各种图
#线形图
import numpy as np
import pandas as pd
df1=pd.DataFrame(data=np.random.randn(1000,4),
index=pd.date_range(start='10/10/2023',periods=1000),
columns=list('ABCD'))
df1.cumsum().plot()
#2、条形图
df2=pd.DataFrame(data=np.random.rand(10,4),
columns=list('ABCD'))
df2
df2.plot.bar(stacked=True)#stacked表示堆叠
#3、饼图,百分比,自动计算
df3=pd.DataFrame(data=np.random.rand(4,2),
index=list('ABCD'),
columns=['One','Two'])
df3.plot.pie(subplots=True,figsize=(8,8),colors=np.random.random(size=(4,3)))#figsize尺寸,subplots表示>=两个图,colors可以不写
#散点图
df4=pd.DataFrame(np.random.rand(50,4),columns=list('ABCD'))
df4.plot.scatter(x='A',y='B')#A和B关系绘制
# #在一张图中绘制AC散点图,同时绘制BD散点图
# ax=df4.plot.scatter(x='A',y='C',color='DarkBlue',label='Group 1');
# df4.plot.scatter(x='B',y='D',color='DarkGreen',label='Group 2',ax=ax)
# #气泡图,散点有大小之分
# df4.plot.scatter(x='A',y='B',s=df4['C']*200)
df4['F']=df4['C'].map(lambda x : x+np.random.randint(0,5,size=1)[0])
df4
df4.plot.scatter(x='C',y='F')
#5、面积图
df5=pd.DataFrame(data=np.random.rand(10,4),
columns=list('ABCD'))
df5.plot.area(stacked=True);#是否堆叠,是
二、Matplotlib基础
2.1 图形绘制
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,2*np.pi,100)
y=np.sin(x)#正弦波,x:Numpy数组。所有的数据,进行正弦计算
plt.plot(x,y)
plt.xlim(-1,10)
plt.ylim(-1.5,1.5)
plt.grid(color='green',alpha=0.5,linestyle='--',linewidth=1)
2.2 坐标轴刻度、标签、标题
列表生成式,本机字体查找
from matplotlib import font_manager
fm=font_manager.FontManager()
[font.name for font in fm.ttflist]#列表生成式,本机字体查找
plt.figure(figsize=(9,6))#图的尺寸
plt.plot(x,y)
plt.rcParams['font.family']='KaiTi'#设置字体,不显示负号
plt.rcParams['font.size']=28
plt.rcParams['axes.unicode_minus']=False#可显示数字的负号
plt.title('正弦波',fontsize=28,color='red',pad=20)#pad间距
plt.xlabel('X')
plt.ylabel('f(x)=sin(x)',rotation=0,horizontalalignment='right')#rotation设置标签为水平,horizontalalignment='right'标签右对齐
a=plt.yticks([-1,0,1])#调整刻度
_=plt.xticks([0,np.pi/2,np.pi,1.5*np.pi,2*np.pi],
[0,r'$\frac{\pi}{2}$',r'$\pi$',r'$\frac{3\pi}{2}$',r'$2\pi$'],
color='red')
2.3 图例
import numpy as np
import matplotlib.pyplot as plt
#1、图形绘制
x=np.linspace(0,2*np.pi)#x轴
#y轴
y=np.sin(x)
#绘制线形图
#调整尺寸
plt.figure(figsize=(9,6))
plt.plot(x,y)
#2、图例
plt.plot(x,np.cos(x))#余弦波
plt.legend(['Sin','Cos'],fontsize=18,loc='center',ncol=2,
bbox_to_anchor=[0,1.05,1,0.2])#x,y,width,height,左下角(0,0),右上角(1,1)
2.4 脊柱移动(坐标轴的移动)
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(-np.pi,np.pi,50)
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(9,6))
#plot绘制两个图形,x-y成对出现,可以!!!
plt.plot(x,np.sin(x),x,np.cos(x))
ax=plt.gca()#获取当前视图
# ax.set_facecolor('green')#全图底色变绿
#右边和上面脊柱消失
# ax.spines['right'].set_color('white')
# ax.spines['top'].set_color('#FFFFFF')
ax.spines['right'].set_alpha(0)#效果和上面两行一样
ax.spines['top'].set_alpha(0)
# #设置下面左边脊柱位置,data表示数据,axes表示相对位置0~1
ax.spines['bottom'].set_position(('data',0))#下面的线放在竖直中间
ax.spines['left'].set_position(('data',0))#左边的线放在水平中间
plt.yticks([-1,0,1],labels=['-1','0','1'],fontsize=18)
_=plt.xticks([-np.pi,-np.pi/2,np.pi/2,np.pi],
labels=[r'$-\pi$',r'$-\frac{\pi}{2}$',r'$\frac{\pi}{2}$',r'$\pi$'],
fontsize=18)
# plt.grid()#网格线
plt.savefig('./1.png')#图片保存,dpi=300高清,jpg,pdf都可以存
三、风格样式
3.1 颜色、线形、点形、线宽、透明度
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,2*np.pi,20)#等差数列,20个
y1=np.sin(x)
y2=np.cos(x)
# 设置颜色、线型、点型
plt.plot(x,y1,color='indigo',ls='-.',marker='p')#maker代表特定形状,p五边形
plt.plot(x,y2,color='#FF00EE',ls='--',marker='o')#圆,虚线
plt.plot(x,y1+y2,color=(0.2,0.7,0.2),ls=':',marker='*')
plt.plot(x,y1+2*y2,linewidth=3,alpha=0.7,color='orange')#线宽,透明度0.7
plt.plot(x,2*y1-y2,'bo--')#参加连用
3.2 更多属性设置
import numpy as np
import pandas as pd
def f(x):
return np.exp(-x)*np.cos(2*np.pi*x)
x=np.linspace(0,5,50)
plt.figure(figsize=(9,6))
#plot参数
plt.plot(x,f(x),color='purple',
marker='o',#点样式
ls='--',#线样式
lw=2,#线宽
alpha=0.6,#透明度
markerfacecolor='red',#点颜色
markersize=10,#点大小
markeredgecolor='green',#点边缘色
markeredgewidth=3)#点边缘宽度
plt.xticks(size=18)#设置刻度大小
_=plt.yticks(size=18)
四、多图布局
4.1 子视图
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,2*np.pi)
plt.figure(figsize=(9,6))
# 创建子视图*np
#2行,1列,1第一个图
ax=plt.subplot(2,1,1)
ax.plot(x,np.sin(x))
fig,axes=plt.subplots(2,2)#四个图
#索引,0开始
axes[0,0].plot(x,np.sin(x),color='red')
axes[0,1].plot(x,np.sin(x),color='green')
axes[1,0].plot(x,np.cos(x),color='purple')
axes[1,1].plot(x,np.cos(x))
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(-np.pi,np.pi,20)#20个marker
y=np.sin(x)
#子视图1
plt.figure(figsize=(9,6))
ax=plt.subplot(221)#两行两列第一个子视图,可以写一起,可以逗号隔开
ax.plot(x,y,color='red')
ax.set_facecolor('green')#调用子视图设置方法,设置子视图整体属性
#子视图2
ax=plt.subplot(2,2,2)#两行两列第二个子视图
line,=ax.plot(x,-y)#返回绘制对象,#列表中只有一个数据,可加逗号直接取出,相当于返回line,再取line[0]
line.set_marker('*')#调用对象设置方法,设置属性
line.set_markerfacecolor('red')
line.set_markeredgecolor('green')
line.set_markersize(10)
#子视图3
ax=plt.subplot(2,1,2)#两行一列第二个子视图
plt.sca(ax)#设置当前视图
x=np.linspace(-np.pi,np.pi,200)
plt.plot(x,np.sin(x*x),color='red')
4.2 嵌套
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(-np.pi,np.pi,25)
y=np.sin(x)
fig=plt.figure(figsize=(9,6))#创建视图
plt.plot(x,y)
#嵌套方式一,axes轴域(横纵坐标范围),子视图
ax=plt.axes([0.2,0.55,0.3,0.3])#参数含义[left,bottom,width,height]
ax.plot(x,y,color='g')
#嵌套方式二
ax=fig.add_axes([0.55,0.2,0.3,0.3])#使用视图对象添加子视图
ax.plot(x,y,color='r')
五、多图布局
5.1 双轴显示
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(-np.pi,np.pi,50)
y=np.sin(x)
plt.plot(x,y,color='blue')
_=plt.yticks(np.linspace(-1,1,11),color='blue')
ax=plt.gca()#获取当前视图
#twinx 也有twiny,前者更常用
ax2=ax.twinx()#双胞胎,两个x轴,合到一起的,两个x轴,对应着两个y轴,如果没有这个,因为有第10行,左边刻度极其压缩
#其中一个视图,纵坐标范围:-1~1.0
#另一个视图,范围0~25
#刻度会自适应
y2=np.exp(x)#自然底数e的幂函数
plt.plot(x,y2,color='red')#默认向ax2这个子视图中绘制
plt.yticks(np.arange(0,26,5),color='red')
六 文本、注释、箭头
6.1、文本
import numpy as np
import matplotlib.pyplot as plt
#字体属性
font={'fontsize':20,
'family':'Kaiti',
'color':'red',
'weight':'bold'}#字体加粗
x=np.linspace(0.0,5.0,100)
y=np.cos(2*np.pi*x)*np.exp(-x)
plt.figure(figsize=(9,6))
plt.plot(x,y,'k')#k黑色
plt.title('exponential decay',fontdict=font,pad=20)#视图的标题,pad边距,小标题
plt.suptitle('指数衰减',y=1.05,fontdict=font,fontsize=30)#超级标题,figure的大标题
plt.text(x=2,y=0.65,#横纵坐标位置
s=r'$\cos(2\pi t) \exp(-t)$',fontdict=font)#文本内容
plt.xlabel('time(s)')
plt.ylabel('voltage(mV)')
# plt.show()
6.2、注释
import numpy as np
import matplotlib.pyplot as plt
fig,ax=plt.subplots()
x=np.arange(0.0,5.0,0.01)#间隔0.01
y=np.cos(2*np.pi*x)
line,=ax.plot(x,y,lw=2)
# plt.rcParams['font.family']='STKaiti'#中文文本,不显示负号
plt.rcParams['axes.unicode_minus']=False#可显示数字的负号
plt.rcParams['font.size']=20
ax.annotate('local max',#文本内容
xy=(2,1),#箭头指向位置
xytext=(3,1.5),#文本位置
arrowprops=dict(facecolor='black',shrink=0.05))#箭头属性
ax.annotate('local min',#文本内容
xy=(2.5,-1),#箭头指向位置
xytext=(4,-1.8),#文本位置
arrowprops=dict(facecolor='black',
width=2,#箭头宽度
headwidth=10,#箭头头部宽度
headlength=10,#箭头头部长度
shrink=0.1))#箭头两端收缩的百分比,总长
ax.annotate('median',#文本内容
xy=(2.25,0),#箭头指向位置
xytext=(0.5,-1.8),#文本位置
arrowprops=dict(arrowstyle='-|>'),#箭头样式
fontsize=20)
ax.set_ylim(-2,2)#y轴范围调宽
七 常用视图
7.1 折线图
import numpy as np
import matplotlib.pyplot as plt
x=np.random.randint(0,10,size=15)
#一图多线
plt.figure(figsize=(9,6))
plt.plot(x,marker='*',color='r')
plt.plot(x.cumsum(),marker='o')
#多图布局
fig,axs=plt.subplots(2,1)
#设置宽高
fig.set_figwidth(9)
fig.set_figheight(6)
axs[0].plot(x,marker='*',color='red')
axs[1].plot(x.cumsum(),marker='o')
7.2 柱状图
import numpy as np
import matplotlib.pyplot as plt
labels = ['G1','G2','G3','G4','G5','G6']#级别,横坐标
men_means=np.random.randint(20,35,size=6)
women_means=np.random.randint(20,35,size=6)
men_std=np.random.randint(1,7,size=6)
women_std=np.random.randint(1,7,size=6)
width=0.35
plt.bar(labels,#横坐标
men_means,#柱高
width,#线宽
yerr=men_std,#误差条,图中黑色的竖条
label='Men')#标签
plt.bar(labels,women_means,width,yerr=women_std,
bottom=men_means,#条形图,绘制时,落上去
label='Women')
plt.ylabel('Scores')
plt.title('Scores by group and gender')
plt.legend()
7.3 箭头
import matplotlib.pyplot as plt
import numpy as np
loc=np.random.randint(0,10,size=(10,2))
plt.figure(figsize=(10,10))
plt.plot(loc[:,0],loc[:,1],'gh',ms=20)#ms表示大小
plt.grid(True)
#路径
way=np.arange(10)#0、1、2.。。。。9 索引
np.random.shuffle(way)#洗牌,打乱顺序
for i in range(0,len(way)-1):#for循环遍历,少一个,因为最后一个不需要连,10个点,9条线
start =loc[way[i]]#起点
end=loc[way[i+1]]#终点
plt.arrow(x=start[0],y=start[1],#箭头起点
dx=end[0]-start[0],dy=end[1]-start[1],#坐标移动位置
head_width=0.2,lw=2,#head_width箭头长度,lw箭尾线宽
length_includes_head=True)#长度计算包含箭头箭尾
plt.text(start[0],start[1],s=i,fontsize=18,color='red')#文本
if i==len(way)-2:#最后一个点
plt.text(end[0],end[1],s=i+1,fontsize=18,color='red')
start =loc[way[-1]]#最后一个点,最后一个和第一个相连
end=loc[way[0]]#起点,对应着0点
plt.arrow(x=start[0],y=start[1],#箭头起点
dx=end[0]-start[0],dy=end[1]-start[1],#坐标移动位置
head_width=0.2,lw=2,#head_width箭头长度,lw箭尾线宽
length_includes_head=True,color='red')#长度计算包含箭头箭尾
八 柱状图带文本
import numpy as np
import matplotlib.pyplot as plt
boy=np.random.randint(20,35,size=6)
girl=np.random.randint(20,35,size=6)
labels=['G1','G2','G3','G4','G5','G6']
plt.figure(figsize=(9,6))
x=np.arange(6)
width=0.3
plt.bar(x-width/2,boy,width=width)
plt.bar(x+width/2,girl,width=width)
plt.legend(['Boy','Girl'])
plt.xticks(x,labels,fontsize=20)
# 放置文本 text
for i in range(6):
s1=boy[i]
plt.text(x=i-0.15,y=s1+1,s=s1,ha='center')
s2=girl[i]
plt.text(x=i+0.15,y=s2+1,s=s2,ha='center')
plt.ylim(0,40)
九 极坐标图
9.1 线性极坐标图
import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,4*np.pi,200)
y=np.linspace(0,2,200)
ax=plt.subplot(111,projection='polar',facecolor='lightgreen')#极坐标projection='polar'
ax.plot(x,y)
#设置
ax.set_rmax(3)
ax.set_rticks([0.5,1,1.5,2])
ax.grid(True)#网格线
9.2 条形极坐标图
import numpy as np
import matplotlib.pyplot as plt
N=8#分成8份
x=np.linspace(0.0,2*np.pi,N,endpoint=False)
#纵坐标
y=np.random.randint(3,15,size=N)
#宽度,扇形宽度,8份占满一个圆
width=np.pi/4
#颜色,0到1
colors=np.random.rand(8,3)#随机生成颜色
#创建极坐标
ax=plt.subplot(111,projection='polar')#polar表示极坐标
#绘制条形图
ax.bar(x,y,width=width,color=colors)
十 直方图
import numpy as np
import matplotlib.pyplot as plt
mu=100#平均值
sigma=15#标准差
#10000个数据
x=np.random.normal(loc=mu,scale=15,size=10000)
fig,ax=plt.subplots()
#描述统计性的数据
#数据量比较大,通过绘制直方图,看出数据内部关系
#density=False 统计数字在某个范围内的次数
#density=True 统计数字在某个范围内的概率
#n 出现的次数、bins 柱子横坐标、
n,bins,patches=ax.hist(x,200,density=True)#直方图(也是条形图组成),分成200份
十一 箱型图
import numpy as np
import matplotlib.pyplot as plt
data=np.random.normal(size=(500,4))#正态分布
labels=['A','B','C','D']
#用Matplotlib画箱型图
#黄色的线是中位数
# 查看数据分布情况,看异常值
_=plt.boxplot(data,1,'ro',labels=labels)#红色的圆点是异常值
十二 散点图
import numpy as np
import matplotlib.pyplot as plt
data=np.random.randn(100,2)
s=np.random.randint(100,300,size=100)
color=np.random.randn(100)
plt.scatter(data[:,0],#横坐标
data[:,1],#纵坐标
s=s,#尺寸
alpha=0.5)#透明度
十三 饼图
import numpy as np
import matplotlib.pyplot as plt
#解决中文字体乱码的问题
plt.rcParams['font.sans-serif']='Kaiti'
labels=['五星','四星','三星','二星','一星']#标签
percent=[95,261,105,30,9]#某市星级酒店数量
#设置图片大小和分辨率
fig=plt.figure(figsize=(5,5),dpi=150)
#偏移中心量,突出某一部分
explode=(0,0.1,0,0,0)#想移动哪个,对应labels修改数据即可,0.1表示自身高度的10%
#绘制饼图:autopct显示百分比,这里保留一位小数;shadow控制是否显示阴影
_=plt.pie(x=percent,#数据
explode=explode,#偏移中心量
labels=labels,#显示标签
autopct='%0.1f%%',#显示百分比
shadow=True)#阴影,3D效果
十四 热力图
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
#标签
vegetables=['cucumber','tomato','lettuce','asparagus','potato','wheat','barley']
farmers=list('ABCDEFG')
#创造数据,随机数
harvest=np.random.rand(7,7)*5#农民丰收数据,rand正,randn有正有负
plt.rcParams['font.size']=18
plt.rcParams['font.weight']='heavy'
plt.figure(figsize=(9,9))
#imshow,显示图片
im=plt.imshow(harvest)#harvest为随机数,所以颜色也各不相同,可加参数改变颜色cmap=''
#绘制文本
for i in range(len(vegetables)):
for j in range(len(farmers)):
text =plt.text(j,i,round(harvest[i,j],1),
ha='center',va='center',color='r')
plt.colormaps()#颜色
十五 蜘蛛图
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family']='Kaiti'
labels=np.array(['个人能力','IQ','服务意识','团队精神','解决问题能力','持续学习'])
y=[83,61,95,67,76,88]
#画图数据准备,角度、状态值
x=np.linspace(0,2*np.pi,len(labels),endpoint=False)
x=np.concatenate((x,[x[0]]))#首尾相连,增加了一个x,后面去掉
y=np.concatenate((y,[y[0]]))
#用Matplotlib画蜘蛛图
fig=plt.figure(figsize=(6,6))
ax=fig.add_subplot(111,polar=True)
ax.plot(x,y,'ro-',linewidth=2,markersize=10)#连线,o顶点形状,-表示实线,r红色,markersize点大小
ax.fill(x,y,alpha=0.2)#填充颜色
#x=3.14--->180
#标签显示,去掉一个,切片
_=ax.set_thetagrids(x[:-1]*180/np.pi,labels,fontsize=18)
x=np.linspace(0,2*np.pi,len(labels),endpoint=False)
x
结果 array([0. , 1.04719755, 2.0943951 , 3.14159265, 4.1887902 ,
5.23598776])
十六 3D图形
16.1 线形图&散点图
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
x=np.linspace(0,60,300)
y=np.sin(x)
z=np.cos(x)
# fig=plt.figure(figsize=(9,6))#二维
# a3=Axes3D(fig)#二维变成三维
# a3.plot(x,y,z)
plt.rcParams['axes.unicode_minus']=False#可显示数字的负号
plt.figure(figsize=(9,6))
a3=plt.subplot(111,projection='3d')
a3.plot(x,y,z)#普通线形图
a3.set_xlabel('X')
a3.set_ylabel('Y')
a3.set_zlabel('Z')
#散点图
x=np.random.randint(0,60,size=20)
y=np.random.randn(20)
z=np.random.randn(20)
a3.scatter(x,y,z,color='red')#散点图
#调整视图的角度
a3.view_init(elev=20,azim=-30)
16.2 3D条形图
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
from mpl_toolkits.mplot3d.axes3d import Axes3D
month=np.arange(1,5)
#每个月4周 每周都会产生数据
#三个维度:月、周、销量
fig=plt.figure(figsize=(9,6))
ax3=Axes3D(fig)
for m in month:
#每个月都要绘制条形图
ax3.bar(np.arange(1,5),#四周1,2,3,4,理解为横坐标
np.random.randint(1,10,size=4),#理解为纵坐标
zs=m, #蓝色放一月,橙色放二月等等
zdir='x',#在哪个方向上,一排排排列
alpha=0.7,#alpha透明度
width=0.5)
ax3.set_xlabel('月份',fontsize=18,color='red')
ax3.set_xticks(month)
ax3.set_ylabel('周',fontsize=18,color='red')
ax3.set_yticks([1,2,3,4])
ax3.set_zlabel('销量',fontsize=18,color='green')
十七 seaborn
pip install seaborn
17.1 快速入手
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
#style:darkgrid(黑色网格,默认)、whitegrid(白色网格)、dark(黑色背景)、white、ticks(四周有刻度线的白背景)
sns.set(style='dark',context='paper',font='Kaiti')#设置样式,contex:paper、notebook(默认)、talk、poster(越来越粗)
plt.rcParams['axes.unicode_minus']=False#可显示数字的负号
plt.figure(figsize=(9,6))
x=np.linspace(0,2*np.pi,20)
y=np.sin(x)
#lineplot方法
sns.lineplot(x=x,y=y,color='green',ls='--')
sns.lineplot(x=x,y=np.cos(x),color='red',ls='--')
17.2 线形图
fmri.csv中数据:
style=‘event’:根据event属性分类,指定样式,自动分配实线、虚线
hue=‘event’:根据event属性分类,绘制
palette=‘deep’:画板,颜色
17.3 热力图
原flights.csv中数据: