NumPy、Pandas、Matplotlib学习

优点:可以进行矩阵运算,比一个一个算更快。

一、NumPy

一、安装

  1. 首先安装anaconda,详见安装
  2. 其次,执行:conda install numpy 和conda install pandas 及进行安装。

二、基础

  1. 普通矩阵转化为numpy的:array=np.array([ [1,2,3 ][2,3,4 ]]) 还可以设置其格式:np.array([2,3],dtype=np.int)
  2. 输出矩阵的维度:array.ndim 上例中是2
  3. 输出矩阵的形状:array.shape 上例中是(2,3)
  4. 输出矩阵大小:array.size 上例中是6
  5. 输出矩阵形式:array.dtype 上例中是int64
  6. 生成全零矩阵:a=np.zeros( (3,4) ) 生成一个三行四列的矩阵,注意大小一定要用括号括住!
  7. 生成全部为1的矩阵:np.ones( () )
  8. 生成什么都没有的矩阵(数据接近于零):np.empty( () )
  9. 生成有序矩阵:np.arange( 10,20 ,2) 分别表示起始值(默认为0)、终止值(最终不包含)、步长(默认为1)
  10. 还可以用:np.arange(12)
  11. 重新定义形状:np.reshape( (3,4) )
  12. 生成一个线段:np.linspace(1, 10, 5) 从第一个数开始到最后一个数(包含)生成一个被分成了最后一个数表示的段数的矩阵,[1. 3.25 5.5 7.75 10.]
  13. 生成一个随机矩阵:np.random.randn( () ) 在random模块下的randn

三、基础运算

一、一维
  1. 加+、减-、乘*、除/:逐个相运算
  2. 平方**: 逐个平方
  3. sin:逐个求sin值
  4. 判断值大小:print(array<3) 输出一个bool类型的同样大小的矩阵,true表示小于,false表示大于等于
二、矩阵
  1. 乘*:逐个相乘
  2. 乘:矩阵的乘法:np.dot(array,array2) 也可以写成:a.dot(b)
  3. 整个矩阵求和:np.sum(array)
  4. 在矩阵第一行求和还可以定义维度:np.sum(array,axis=1) array是一个二维矩阵的话,axis=1表示对每一行求和,返回一个矩阵,有几行矩阵有几项;axis=0表示对每一列求和
  5. 矩阵求最小值:np.min(array)
  6. 矩阵求最大值:np.max(array)
  7. 矩阵最小值的索引:np.argmin(array)
  8. 矩阵平均值:np.mean(array) 当然也可以array.mean()
  9. 矩阵中位数:np.median(array)
  10. 矩阵累积求和:np.cumsum(array) 返回一个一维矩阵,第一个数是第一个的值,第二个是前两个相加的值,第n个是前n个相加的值
  11. 矩阵累差:np.diff(array) 第一个是前两个数的差,第二个是第二个和第三个的差,因此最后会少一个
  12. 矩阵非零的数的索引:np.nozero(array) 几维返回几个一维矩阵
  13. 矩阵排序:np.sort(array) 逐行排序
  14. 矩阵的转置:np.transpose(array) 也可以写成array.T 但是不能将一个一维的横向的改变成为垂直的[[1],[1],[1]],因为是一维的一个。实现方法:可以在列上新建一个维度array[:,np.newaxis]
  15. 矩阵截取:np.clib(array,5,9) 将array中小于5的变成5,大于9的变成9,其余的不变
  16. 计算都可以指定axis,axis=i,相当于对第i个维度进行操作。

四、索引

  1. 按索引进行输出:array[3] 一维输出第三个,二维索引第二行 array[1,2]等价于array[1][2]
  2. 切片:某一维度只有一个:表示全部 a:b表示该维度从a开始到b不含b的
  3. for循环默认循环行,可以先转置后迭代列
  4. 一个一个迭代可以先将矩阵展平:array.flatten()返回一个被展平的矩阵;array.flat返回展平的迭代器

五、合并

  1. 垂直合并,可以理解为向下合并:np.vstack( (array,array2) ) #vertical stack,合并后[[array],[array2]]
  2. 水平合并,可以理解为左右合并:np.hstack( (array,array2) ) #horizontal stack,合并后[array,array2]
  3. 多项合并:np.concatenate( (array,array2,array3), axis=0 ) 多项合并,可以指定轴

六、分割

  1. 相等分割:np.split(array,2,axis=1) 对矩阵进行分割,分成2块,按行分割,原来一行有四个则分割完每个一行两个
  2. 不等分割:np.array_split(array,3,axis=1) 对矩阵进行分割,例如一行有四个,分成每行2 1 1 个
  3. 纵向分割:np.vsplit(array,3) 相当于按照列,一共9行,分成3 3 3行的
  4. 横向分割:np.hsplit(array,3) 相当于按照列,一共9列(一行9个),分成3 3 3列的(每行有三个)

七、拷贝和深拷贝

  1. b=array 那么array改变,b也会被改变,也就是说b is array 是True
  2. d=b 由于b=array,因此array、b、d改一个则其他几个都会变
  3. 深拷贝:b=array.copy() 相当于把array的值赋值给b,但是两者之间没有关联

二、Pandas

字典形式的numpy,可以给不同的行不同的列重新命名。

一、基本功能

  1. 初始化一个:s=pd.Series([1,3,6,np.nan,1]) 对其输出,可以看到对每个值进行了排序,会多一个序号项,且最后会输出其dtype类型。
  2. 初始化一个datetime:dates=pd.date_range(‘2021-11-02’,periods=6) 对其输出可以看到二号到七号六个日期
  3. 用列表初始化一个dataframe:df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=[‘a’,‘b’,‘c’,‘d’]) 对其输出,其行的索引是dates(也就是2里面我们自己定义的那个,以此为每一行的名字,如果没有默认:int从零开始),列的索引是‘a’,‘b’,‘c’,‘d’(默认:int从0开始)
  4. 用字典初始化一个dataframe:df=pd.DataFrame({‘A’:1.,
    ​ ‘B’:pd.Timestamp(‘20130102’),
    ​ ‘C’:pd.Series(1,index=list(range(4),dtype=‘float32’)),
    ​ ‘D’:np.array([3]4,dtype=‘int32’),
    ​ ‘E’:pd.Categorical([“test”,“train”,“test”,“train”]),
    ​ ‘F’:‘foo’}) 对其输出可以发现由于E有4个,为了对其,因此其他的全部扩充(广播)到4个(相同的),也就是说最终是4
    6的格式。
  5. 还可以用查看其属性:
    1. df.dtypes 输出其每一列的数据形式。
    2. df.index 返回所有行的序号(也可以理解为名字)的列表。
    3. df.columns 返回列的名字的列表。
    4. df.values 返回所有值。
  6. df.describe() 返回每一列(同一类型,且会自动略过字符串等形式)的平均值、数量、等一系列信息。df.T 进行转置。
  7. 按序号排序:df.sort_index(axis=1, ascending=False) 会对每一列的名字进行排序,false表明倒序排列;当然也可以axis=0,表示对每一行的名字进行排序;true表示正序排列。
  8. 按值排序:df.sort_valuse(by=‘E’) 指定某一列进行排序。
  9. 显示前几个数据:df.head() 可以指定前几个,默认是前5个。

二、选择数据

  1. 还是上面的数据,想要输出某一列:df[‘A’]等效于df.A 都会输出列名字是A的那一列。
  2. 想要输出某几行,可以先切片:df[0:3]等效于df[‘0’:‘3’] 都会输出前三行,后者表示的是行的名字,相当于列的’A’。
  3. 根据标签进行选择:df.loc[:,[‘A’,‘B’]] #select by label:loc 可以选择行也可以选择列df.loc[‘3’]
  4. 根据位置进行选择:df.iloc[3:5,1] #select by position:lioc 还可以不连续筛选df.iloc[[0,1,3],1:3]
  5. 根据标签和位置一起筛选:df.ix[:3,[‘A’,‘C’]] #mixed selection:ix
  6. 根据是否筛选:df[df.A>8] #Boolean indexing 筛选出A列中>8的数字(和符合条件的一行的其他列也会显示出来)

三、设置值

  1. 对选定的位置或范围赋值:直接赋值就行(选择范围时注意上一块中6强调的,符合条件的同一行其他列也会显示,因此也会被更改,可以再次选择某一列,一方改错:df.A[df.A>8]=0,这样就只会更改A列中大于8的数为0了)。
  2. 加上空列:df[‘F’]=np.nan
  3. 加上新列:df[‘E’]=pd.Series([1,2,3,4],index=原有的index一样的序列,这样才能对齐)

四、处理丢失数据

  1. 丢掉NaN的数据:df.dropna(axis=0,how=‘any’) #how={any,all} any表示只要该行有NaN就丢弃,all表示只有当该行全部都是NaN时才丢弃该行 axis=0表示按行丢弃;axis=1表示按列丢弃
  2. 为NaN数据赋值:df.fillna(value=0)
  3. 检查是否有NaN值:df.isnull() 返回一个表格,True表示是NaN,False表示不是
  4. 直接看是否有NaN项:np.any(df.isnull()=True) 直接判断是否有等于True的值,有则返回True

五、导入导出数据

  1. 可以读取的数据类型:read_csv read_excel read_hdf read_sql read_json read_msgpack(experimental) read_html read_gbq(experimental) read_stata read_sas read_clipboard read_pickle
  2. 可以保存的数据类型(和read一一对应):to_csv to_excel to_hdf to_sql to_json to_msgpack(experimental) read_html to_gbq(experimental) to_stata to_clipboard to_pickle
  3. 读取使用:data=pd.read_csv(‘student.csv’) 然后直接输出就行,会自动加一个索引
  4. 存储使用:data.to_pickle(‘student.pickle’) 然后就会保存到对应文件
    参考文档:

六、合并

1.concatenating
  1. axis=0竖向合并(上下合并),也就是行合并(最终行数增多);axis=1横向合并(左右合并),也就是列合并(最终列数增多)。
  2. 一般每列一样时使用axis=0,使相同含义的数据在同一列。
  3. 格式:pd.concat([df1,df2,df3],axis=0,ignore_index=True) 因为合并玩行的名字,也就是索引会出现重复,因此可以选择ignore_index=True表示合并后重新排行的索引。
2.join,[‘inner’,‘outer’]
  1. 是concatenating的一个参数,可以合并列名不一样的df。
  2. 默认的join模式是NaN填充(outer),相同的还是合并成一个列,不是公共所有的会新添一列,原本没有的会在该列上补上NaN。
  3. inner是删除,也就是说不是公共所有的就会被删除,留下公共所有的合并。
3.join_axes
  1. join是参考了两者,join_axes可以指定参考哪一个,例如制定了df1,那么df1中有的会被保留,别的没有的会被NaN补全,df1中没有的会被删去。
4.append
  1. 向后加元素,可以向行或者列后加,可以加一行(列)也可以直接加一个df,相当于合并。
  2. 格式:df1.append(df2,ignore_index=True) 可以合并不止一个,将df2改为[df2,df3]就行
  3. 格式:s1=pd.Series([1,2,3,4],index=[‘a’,‘b’,‘c’,‘d’])
    res=df1.append(s1,ignore_index=True)
5.merge
  1. 相当于数据库中的key,以相同的key(指定的行或者列)进行合并。
  2. 格式:pd.merge(df1,df2,on=‘key’) #merging two df by key/keys
  3. 格式:pd.merge(df1,df2,on=[‘key1’,‘key2’]) #consier two keys 默认合并方法是how=‘inner’
  4. 参数:how=[‘left’,‘right’,‘outer’,‘inner’],inner只保留相同不同删去;outer补上NaN;left以第一个为参照,第一个有的被保留或补充,没有的被删去。
  5. 参数:indicator默认是False,若设置为True则会显示合并过程中的原因(保留了那个没有保留那个),left_only;both;right_noly。默认该列的名字是——merge,还可以直接赋值indicator='indicater_show’直接为该列改名。
  6. 参数:pd.merge(df1,dfd2,left_index=True,right_index=True,how=‘outer’) #merge by index(索引,最左边的一列) 相当于考虑的时候考虑的不是某个有key含义的列,而是index。
  7. 参数:suffixes=[’_df1’,’_df2’]#handle overlapping 区分两个df里一样的列名,会多一个你设置的后缀

七、plot图表

  1. 可视化必不可少的:import matplotlib.pyplot as plt
  2. 将想要可视化的数据例如是data:data.plot() 就可以plot上去
  3. 然后显示出来即可:plt.show()
  4. 显然可以显示Series类型的数据,还可以显示DF类型的,步骤一样,不过会有很多条线。
  5. plot里有很多参数,可以设定其颜色粗细等,linestylr=’–’ #虚线。
  6. plot methods:‘bar’,‘hist’,‘box’,‘kde’,‘area’,‘scatter’,‘hexbin’,‘pie’
  7. 和plot类似的scatter:打印出来是点 plt.scatter(x=,y=)
  8. scatter:只有两个属性,可以用到data.plot,scatter(x=‘A’,y=‘B’) df可能有很多列,但是只能用其中的两个,如此处选择的是A和B。还可以设置color=‘DarkGreen’。还可以命名label=‘Class 1’。
  9. 可以在一张图上画出两个将第一个赋值给变量abc,在第二个里面多设置一个参数ax=abc。

三、Matplotlib

一、安装

  1. 安装过numpy
  2. anaconda下安装就行

二、基本用法

  1. 导入最常用的包:import matplotlib.pyplot as plt 以及用numpy制作数据
  2. 步骤:生成数据->plt.plot(x,y)->plt.show()
  3. 生成的图片的下图标作用:主界面 上一步 下一步 拖动 放大某一块 调整数值 保存
  4. 可以为每条线命名,plt.plot(x,y)

三、figure图像

  1. figure就是一张图像,相当于区分开每张图。
  2. 首先定义一个figure,也就是plt.figure(),此后的数据将会在这张图上显示,直到另一个该语句出现。
  3. 可以对其命名和修改大小:plt.figure(num=3,figsize=(8,5)) 前一个参数是名字叫figurenum,后一个参数是大小,最后显示语句和正常的一样。
  4. plot参数:color;linestyle;linewidth。

四、坐标轴设置

  1. 设置坐标轴范围(可以显示的范围):plt.xlim((-1,2)) plt.ylim((-2,3))
  2. 描述坐标轴(命名):plt.xlable(‘I am x’) plt.ylable(‘I am y’)
  3. 设置坐标大小间隔:new_ticks=np.linespace(-1,2,5) plt.xticks(new_ticks)
  4. 设置坐标名称(文字代替数字):plt.yticks([-2,-1.5,-1,1,3],[‘really bad’,‘bad’,‘normal’,‘good’,‘really good’]) 字体更改,可以在前后加上’$ ‘,变成’$ really\ good$ ',在$中无法识别空格,需要加上转移符号\,前面一半加上r表示正则表达式,还可以显示特殊符号(和markdown的数学公式相似)。
  5. 设置坐标轴的位置:
ax=plt.gca()   #get current axis   得到当前坐标轴
ax.spines['right'].set_color('none')   #设置右边框消失
ax.spines['top'].set_color('none')   #设置上边框消失
ax.xaxis.set_ticks_position('bottom')   #设置x轴为下边框
ax.yaxis.set_ticks_position('left')   #设置y轴为左边框
#outward,axes(要定位到另一个轴的相对那个位置)
ax.spines['bottom'].set_position(('data' ,-1))   #设置横坐标轴位置,首先传入data,说明轴的位置和坐标轴上的值有关,在data值为-1,也就是纵坐标为-1时是x轴的原点。
ax.spines['left'].set_position(('data' ,0))   #设置纵坐标轴位置,首先传入data,说明轴的位置和坐标轴上的值有关,在data值为0,也就是横坐标为0时是y轴的原点。

五、legend图例

  1. 图例:描述图中线条的含义的小图
  2. 首先为每条线命名,可以直接使用默认参数:plt.legend()
  3. 参数:plt.legend(handles=[l1,l2,],labels=[‘aaa’,‘bbb’],loc=‘best’) #loc:best 表示默认找一个数据最少的放下;也可以upper right…等指定地方;handles:放入需要描述的线,其中l1,=plt.plot(x,y,label=‘up’),变量名后的,不能省略,想传进去必须有逗号;labels:想要给线的名字,而不会用到线本身的label,如果labels比线少那么会按照labels里打印,没有名字的不打印,[‘aaa’,]时只显示aaa对应的第一条线。

六、Annotation标注

  1. 可以强调某个点,画出其在坐标轴对应的虚线;并在该点处添加注释;或者直接对整条线进行注释。
  2. 添加描述:
import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-3,3,50)
y=2*x+1
plt.figure(num=1,figsize=(8,5),)
plt.plot(x,y,)

ax=plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'],set_positon(('data',0))
ax.ysxias.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))

#添加对点的注释
x0=1
y0=2*x0+1   #需要描述点
plt.scatter(x0,y0,s=50,color='b')   #scatter就是plot上去点
plt.plot([x0,x0],[0,y0],'k--',lw=2.5)   #plot出一条该点到x轴的垂线,此处还是虚线用'--'表示,颜色是black用‘k’表示,宽度lw是2.5
#method 1 添加对该点的描述
plt.annotate(r'$2x+1=%s$'%y0,xy=(x0,y0),xycoords=‘data’,textcoords=’offset points‘,fontsize=16,arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))   
#向字符串内传入%s是%y0的值;
#xy表示对那个点进行注释;
#xycoords表明前面的点是基于'data'的(也就是点的值);
#xytest表示描述放置的位置;
#textcoords表示描述参考的位置默认和xy一样也就是'offset points';
#fontsize:表示描述字体的大小;
#arrowprops:表示箭头的方向线,需要用dict描述,前一个参数用图例描述了箭头的形状,后一个参数描述了箭头的方向。

#method 2 
plt.text(-3.7,3,r'$this\ is\ the\ some text.$',fontdict={'size':16,'color':'r'})   #前两个参数表示位置,后面表示text内容,其中可以使用数学语句,空格也需要转义;最后还可以传入设置的部分参数

plt.show()

七、tick能见度

  1. 原因:线有时候会挡住轴。
for label in ax.get_xticklabels()+ax.get_ytciklabels():
	label.set_fontsize(12)
	label.set_bbox(dict(facecolor='white',edgecolor='None',alpha=0.7))   #背景颜色,边框颜色,透明度(背景有70%,线可以透过30%)

在这里插入图片描述

八、scatter散点数据

  1. 显示一个散点图:
import matplotlib.pyplot as plt
import numpy as np
n=1024
X= np.random.normal(0,1,n)
Y= np.random.normal(0,1,n)
T= np.arctan2(Y,X)   #for color value 计算出每个点的颜色
plt.scatter(X,Y,s=75,c=T,alpha=0.5)   #画出散点,前两个是点的坐标值,s代表size,c代表color,alpha透明度
plt.xlim((-1.5,1.5))   #x轴显示范围
plt.ylim((-1.5,1.5))
plt.xticks(())   #空的ticks,相当于坐标轴上啥也没有
plt.yticks(())
plt.show()

九、bar柱状图

  1. 上下都有的柱状图,上面会标数值,并且会去除x轴y轴上的值
import matplotlib.pyplot as plt
import numpy as np
n=12
X=np.arrange(n)
Y1=(1-X/float(n))*np.random.uniform(0.5,1.0,n)
Y2=(1-X/float(n))*np.random.uniform(0.5,1.0,n)
plt.bar(X,+Y1,facecolor='r',edgecolor='white')   #+代表上面,facecolor代表主体颜色,edgecolor代表背景颜色
plt.bar(X,-Y2,facecolor='k',edgecolor='white')   #-代表下面
#在其上面加上数值
for x,y in list(zip(X,Y1)):   #将X,Y1数据分别传入x,y
	plt.text(x+0.4,y+0.05,'%.2f'%y,ha='center',va='bottom')   #前两个是位置,第三个是内容,ha:horizontal alignment横向对齐,va:纵向对齐

for x,y in list(zip(X,Y2)):   
	plt.text(x+0.4,-y-0.05,'-%.2f'%y,ha='center',va='top')
plt.xlim((-1.5,1.5))   #x轴显示范围
plt.ylim((-1.5,1.5))
plt.xticks(())   #空的ticks,相当于坐标轴上啥也没有
plt.yticks(())
plt.show()

十、等高线图

  1. 地理上常见的那种。
import matplotlib.pyplot as plt
import numpy as np

def f(x,y):
	#the height function
	return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)

n=256
x=np.linspace(-3,3,n)
y=np.linspace(-3,3,n)
X,Y=np.meshgrid(x,y)   #x,y绑定成网格的输入值,因为等高线相当于网格上的不同高度得到的线
plt.contourf(X,Y,f(X,Y),8,alpha=0.75,cmap=plt.cm.hot)   #放上颜色,前两个是值,下一个是求高度的函数,然后是8代表分开程度相当于十部分(可以记住0分成两部分),然后是透明度,然后是颜色地图,每个数值对应一个颜色,这个相当于查找的参考表。
C=plt.contour(X,Y,f(X,Y),8,colors='black',linewidth=.5)   #画上等高线的线,此处的8对应上面的8
plt.clabel(C,inline=True,fontsize=10)   #给等高线加上描述,inline表示画在线里面

plt.xticks(())   #空的ticks,相当于坐标轴上啥也没有
plt.yticks(())
plt.show()

十一、image图片

  1. 相当于图像处理里三通道图像的显示
import matplotlib.pyplot as plt
import numpy as np
#image data
a=np.array([0.31,0.36,0.42,0.36,0.43,0.52,0.42,0.52,0.65]).reshape(3,3)
plt.imshow(a,interpolation='nearest',cmap='bone',origin='upper')   #第一项是数据,然后是显示类型可以参考网站选用不同风格的,然后是颜色参考,然后是方向,upper是数值正向对应。
plt.colorbar()   #颜色对应卡,有很多参数例如可以进行压缩,shrink=0.9展示出来大小只有图片的90%
plt.xticks(())
plt.yticks(())
plt.show()

网站:http://matplotlib.org/examples/images_contours_and_fields/interpolation_mathods.html

十二、3D plot 3D数据

  1. 导入3D模块,X,Y网格成底面,求出高度,构建一个彩虹3D数据,并在x-y上绘制出对应的等高线。
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig=plt.figure()
ax=Axes3D(fig)
#X,Y value
X=np.arange(-4,4,0.25)
Y=np.arange(-4,4,0.25)
X,Y=np.meshgrid(X,Y)   #组成网格
R=np.sqrt(X**2+Y**2)   
#height value
Z=np.sin(R)   #计算高度

ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap=plt.get_cmap('rainbow'))   #plot3D的方式.前三个是数据,后两个分别是x于y的跨度,相当于网格的疏密
ax.contourf(X,Y,Z,zdir='z',offset=-2,cmap='rainbow')   #等高线,前三个是数据,然后说明是从那个等高线压下去的,偏移z轴的位置(一般压到坐标轴在的位置上),颜色参考。
ax.set_zlim(-2,2)
plt.show()

十三、subplot多个显示

  1. 在一个figure上绘制多个图片
  2. 方法一:
import matplotlib.pyplot as plt

plt.figure()
plt.subplot(2,2,1)   #绘制小图,前两个表示分成2行2列,第三个表示绘制的第一张图
plt.plot([0,1],[0,1])
plt.subplot(2,2,2)   #绘制小图,第三个表示绘制的第二张图
plt.plot([0,1],[0,2])
plt.subplot(2,2,3)   #绘制小图,第三个表示绘制的第三张图
plt.plot([0,1],[0,2])
plt.subplot(2,2,4)   #绘制小图,第三个表示绘制的第四张图
plt.plot([0,1],[0,2])

plt.figure()
plt.subplot(2,1,1)   #绘制小图,前两个表示分成2行第一行是1列,第三个表示绘制的第一张图
plt.plot([0,1],[0,1])
plt.subplot(2,3,4)   #绘制小图,前两个表示分成2行第二行是3列,第三个表示绘制的第一张图相当于是第四张图,如果是2会覆盖上面的第一张图显示到第一行的第二张图
plt.plot([0,1],[0,2])
plt.subplot(2,3,5)   #绘制小图,第三个表示绘制的第五张图
plt.plot([0,1],[0,2])
plt.subplot(2,3,6)   #绘制小图,第三个表示绘制的第六张图
plt.plot([0,1],[0,2])
plt.show()
  1. 方法二、三、四:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

#method 1:subplot2grid
plt.figure()
ax1=plt.subplot2grid((3,3),(0,0),colspan=3,rowspan=1)   #分成三行三列,第一个从(0,0)开始,行跨度是3,列跨度是1
#其他可以ax1.set_title()   相当于之前的函数前面加上set_
ax1.plot([1,2],[1,2])   #画上线
ax2=plt.subplot2grid((3,3),(1,0),colspan=2,rowspan=1)   #同一个基准分成三行三列,第二个从(1,0)开始,行跨度是2,列跨度是1(默认是1)
ax3=plt.subplot2grid((3,3),(1,2),colspan=1,rowspan=2)   #同一个基准分成三行三列,第二个从(1,2)开始,行跨度是1,列跨度是2
ax4=plt.subplot2grid((3,3),(2,0),colspan=1,rowspan=1)   #同一个基准分成三行三列,第二个从(1,0)开始,行跨度是1,列跨度是1
ax5=plt.subplot2grid((3,3),(2,1),colspan=1,rowspan=1)   #同一个基准分成三行三列,第二个从(1,0)开始,行跨度是1,列跨度是1
#method 2:gridspec
plt.figure()
gs=gridspec.GridSpec(3,3)   #三行三列
ax6=plt.subplot(gs[0,:])   #从第0行开始,后面是全部的
ax7=plt.subplot(gs[1,:2])   #用索引表示位置
ax8=plt.subplot(gs[1:,2])
ax9=plt.subplot(gs[-1,0])
ax10=plt.subplot(gs[-1,-2])
#method 3:easy to define structure
f,((ax11,ax12),(ax21,ax22))=plt.subplots(2,2,sharex=True,sharey=True)   #2,2表示几行几列,sharex共享x轴,sharey共享y轴(共享后上面的没有x轴右边的没有y轴,因为共享了);返回一个figure的值(等回来可以用f修改参数),以及所有的两行两列的subplot,按照格式定义了所有的ax
ax11.scatter([1,2],[1,2])   #在ax中绘制点图

plt.tight_layout()
plt.show()

十四、图中图

  1. 先画一张大图,,上面加上小图
import matplotlib.pyplot as plt

fig =plt.figure()
x=[1,2,3,4,5,6,7]
y=[1,3,4,2,5,9,6]
#绘制大图
left,bottom,width,height=0.1,0.1,0.8,0.8
ax1=fig.add_axes([left,bottom,width,height])    #定位
ax1.plot(x,y,'r')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.set_title('title')
#绘制小图,可以用同样的方法
left,bottom,width,height=0.2,0.6,0.25,0.25
ax2=fig.add_axes([left,bottom,width,height])
ax2.plot(x,y,'r')
ax2.set_xlabel('x')
ax2.set_ylabel('y')
ax2.set_title('title inside 1')
#绘制小图,可以用不同的方法
plt.axes([0.2,0.6,0.25,0.25])   #这个axes下面全部是关于这个axes的东西
plt.plot(y[::-1],x,'g')   #y[::-1]表示从后向前,间隔为-1;切片的三个参数,开始结尾步长,步长为-1即默认从后向前
plt.xlabel('x')
plt.ylabel('y')
plt.title('title inside 2')

plt.show()

十五、次坐标轴

  1. 相当于共享x轴,左右两边都有y轴。
import matplotlib.pyplot as plt
import numpy as np

x=np.arange(0,10,0.1)
y1=0.05*x**2
y2=-1*y1
fig,ax1=plt.subplots()
ax2=ax1.twinx()   #将ax1翻转过来,获得ax2
ax1.plot(x,y1,‘g-)   #绿色的,线的样式是实线
ax2.plot(x,y2,’b—-)   #蓝色的,线的样式是虚线
ax1.set_xlabel(‘X data’)
ax1.set_ylabel(‘Y1 data’,color=‘g’)
ax2.set_ylabel(‘Y2 data’,color=‘b’)

plt.show()

十六、animation 动画

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation

fig,ax=plt.subplot()
x=np.arange(0,2*np.pi,0.01)
line,=ax.plot(x,np.sin(x))   #因为返回的是一个列表[list],因此想要直接赋值可以在后面加上逗号,这样就会把列表内的第一个值进行赋值,赋值给变量的是数据而不是列表了。

def animate(i):   #传入第i帧
    line.set_ydata(np.sin(x+i/100))    #更新y,这里的100是因为下面定义里的frames是100,每闪过100个后更新
    return line,

def init():
    line.set_ydata(np.sin(x))
    return line,

ani=animation.FuncAnimation(fig=fig,func=animate,frames=100,init_func=init,interval=20,blit=True)   #还有很多的animation,需要传入figure,需要传入function,需要传入frames也就是总共的长度,这里的100相当于闪过100个后重新开始循环,循环开始是从哪里开始的,隔多少毫秒更新一次,每次更新整张图片(False)的所有点还是更新变化的点(True)。
plt.show()
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值