Pyhton学习——可视化学习笔记

python这个假期正在学习,学习的方面是可视化、爬虫、地理数据的处理,第一阶段的任务完成了,花了几天了,白天忙着实习,晚上很晚回去,坚持着学习,今天花了一些时间,来整理这一段时间的学习成果,分享大家,共同努力,第一次写着博客,不足的地方,希望大家批评、指正。

1、matplotlib

常用包:import matlotlib.pyplot as plt

import matplotlib.pyplot as plt
x=[1,2,3,4]
y=[1,-2,4,-6]
plt.plot(x,y)
plt.show()

2、numpy

import numpy as np,numpy是常用于科学计算的包,有着大量的函数,函数引用方法:np.fun(x) x.fun(),常用np.fun(x)
常用函数:c=np.arange(2,11,3)——表示的是范围,2为起始,11为终点,3为步长,默认开始是0
np.random.randint(1,100,10)——随机变量,三个参数,从1开始,到100结束,需要10个参数
np.random.rand(200)——随机变量,取值范围是0-1
np.min(),np.max()
np.sort()——排序函数
np.linspace(-10,10,100) #等值区间,从-10至10,共100个数
linspace不同于arrange,这个可以取值小数,均等分取
np.append不同于列表的添加,列表的添加是在append后面直接加新的值,而np的添加是(旧值,新值)

3、文件读取

import matplotlib.dates as mdates
data,open,close=np.loadtxt('0001.csv',delimiter=',',converters={0:mdates.strpdate2num('%m/%d/%y')},
                           skiprows=1,usecols=(0,1,4),unpack=True)  #converters:将日期转换为matplot可识别的
plt.plot_date(data,open,linstyle='--',color='green',marker='o')  #识别日期进行画图,需要用plot_date函数
plt.plot_date(data,close,linstyle='-',color='red',marker='^')    #这个可以同时在一个图上画出两个线来
plt.show()

本文件中要读取出日期的数据,因此需要引入import matplotlib.dates as mdates
以delimiter进行分割提取,跳过第一行,提取使用第0,1,4列的数据,对数据不进行打包,分别装入到三个参数中data,open,close
日期的转换使用converters参数,形式为字典,需要转换的数据是第0列,%m/%d/%y都是可以修改的

4、样式设置

在绘图中进行设置
linstyle——线型
marker——符号
color——颜色
size——点大小
alpha——透明度
b:blue
g:green
c:cyan 青色
m:magenta 紫色
y:yellow
k:black
w:white
颜色的设置还可以用十六进制、RGB三个参数,注意:单纯的color=0.3,这个就是表示灰度,数值的大小决定着线的颜色大小
RGB颜色查询表:http://www.114la.com/other/rgb.htm
在这里插入图片描述

plt.figtext(0.9,0.08,’ x x x’) #介于xy0-1,1是最右边,0是最左边,设置xy的坐标轴标签
plt.figtext(0.1,0.9,’ y y y’) #加上$$是为了表示成数字的形式,因为没有/,所以不需要用r

5、折线图

import matplotlib.pyplot as plt
import numpy as np

x=np.linspace(-10,10,100)    #等值区间,从-10至10,共100个数
y=x**2
plt.plot(x,y)
plt.show()

6、散点图

import numpy as np
import matplotlib.pyplot as plt
N=200
x=np.random.rand(N)
y=-np.random.rand(N)*-0.5-5
plt.scatter(x,y,s=20,color='r',marker='^',alpha=0.5)    #s表示的是面积,alpha介于0-1
print(len(y))    #y是数组型(元组),也可以表示为列表
plt.show()

散点图的大小,不能使用size,得用s来表示

7、条形图

竖着/横着:

import matplotlib.pyplot as plt
import numpy as np

N=5
y=[1,3,5,6,3]
index=np.arange(N)  #从1开始至N
plt.bar(x=index,height=y,width=0.5,color='red',bottom=0)   #x与botto是相对的,x从index开始,bottom默认从0开始
plt.bar(x=0,height=0.5,width=y,color='red',bottom=index,orientation='horizontal')  #x从0开始,bottom从index开始

一个长方形的设置设计:index,height,width,bottom,orientation很灵活
Index是x轴的起点,bottom是y轴的起点
在这里插入图片描述
在这里插入图片描述
多条式图

index2=np.arange(4)
sales_B=[1,3,6,4]
salse_S=[3,6,2,8]
bar_width=0.3
plt.bar(index2,sales_B,width=bar_width,color='red')
plt.bar(index2+bar_width,salse_S,width=bar_width,color="green")
plt.show()

在这里插入图片描述
堆叠式图

index2=np.arange(4)
sales_B=[1,3,6,4]
salse_S=[3,6,2,8]
bar_width=0.3
plt.bar(index2,sales_B,width=bar_width,color='red')
plt.bar(index2,salse_S,bar_width,color="green",bottom=sales_B)
plt.show()

在这里插入图片描述

8、直方图

直方图常用来表示连续的同类别的数据
条形图表示不连续的不同类别的数据

import matplotlib.pyplot as plt
import numpy as np
x=np.random.randint(1,200,200)
plt.hist(x,bins=100,color='red',density=False)   # bine:分成20个区间,density:进行标准化,显示的是频率,否则为次数
plt.show()

在这里插入图片描述

双变量的直方图
用颜色亮度表示频率

import matplotlib.pyplot as plt
import numpy as np
x=np.random.rand(10000)+2
y=np.random.rand(10000)+5
plt.hist2d(x,y,bins=40)
plt.show()

在这里插入图片描述

9、箱型图

箱型图是一种用作显示一组数据分散情况资料的统计图
上边缘、上四分位数、中位数、下四分位数、下边缘、异常值

import matplotlib.pyplot as plt
import numpy as np
data=np.random.rand(1000)
# data=np.random.normal(size=5000,loc=0,scale=5)   #这是个正态分布,loc表示均值,这里是以y轴对称分布,scale表示标准差,size表示元素个数
plt.boxplot(data,sym='o')
plt.show()

在这里插入图片描述
在这里插入图片描述
也可以使用正态的分布
符号设计不再是marker,而是sym

也可以同时画多个箱型图

data=np.random.normal(size=(5000,4),loc=(0,3,5,3),scale=(5,2,6,1))   #创建4组数据,每组数据5000个
labels=['A','B','C','D']
plt.boxplot(data,labels=labels)
plt.show()

在这里插入图片描述

10、饼状图

import matplotlib.pyplot as plt
import numpy as np
labels=['A','B','C','D']
fracs=[15,60,23,56]
explode=[0,0,0,0.04]
plt.pie(x=fracs,labels=labels,autopct='%.0f%%',explode=explode)   #autopct='%.0f%%':将数据显示在图上的格式串字符
                                                                  #explode:进行突出显示,这里需要设计每块的距离
plt.show()

在这里插入图片描述

11、面向对象可视化与plt可视化

这个适用于单个作图

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,10,1)
y=np.random.rand(len(x))
plt.plot(x,y)
plt.title("pyplot")
plt.show()

这个适用于多个作图

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,10,1)
y=np.random.rand(len(x))
fig=plt.figure()  #创造一个图
ax=fig.add_subplot(111)   #创建一个对象,1行1列,这个对象为第1个
ax.set_title('object oriented')  #标题
ax.plot(x,y)
plt.show()

matplotlib的实例
FigureCanvas:画布
Figure:图
Axes:坐标轴
ax=fig.add_subplot(111) ax为创建的一个对象
意思:返回一个Axes实例
参数一:子图总行数
参数二:子图总列数
参数三:子图位置
创建多个图表

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,100)
fig=plt.figure()
axl=fig.add_subplot(221)
axl.plot(x,x)
ax2=fig.add_subplot(222)
ax2.plot(x**3,x)
ax3=fig.add_subplot(223)
ax3.plot(np.log(x),x)
ax4=fig.add_subplot(224)
ax4.plot(np.sin(x),x)
plt.show()

在这里插入图片描述

产生多张图

import matplotlib.pyplot as plt
import numpy as np
x1=np.arange(1,10,1)
y1=x1*2-3
x2=np.random.rand(8)
y2=x2*3-np.random.randint(1,8)

fig1=plt.figure()
fig2=plt.figure()
ax1=fig1.add_subplot(111)
ax2=fig2.add_subplot(111)
ax1.plot(x1,y1)
ax2.plot(x2,y2)
plt.show()   #展示出所有的图

每一个对象就表示着新的一张图(配合着subplot(111))

12、网格与图例

网格:plt.grid(True) 默认为True,也可以在里面设置其参数
图例在plot中进行设置,展现出来,用plt.legend()

import matplotlib.pyplot as plt
import numpy as np
#面向对象
x1=np.arange(1,10)
y1=np.random.rand(9)
fig=plt.figure()
ax1=fig.add_subplot(111)
ax1.grid(color='g',linewidth='0.6',linestyle='--')
ax1.plot(x1,y1,label='223')
ax1.legend()
plt.show()

在这里插入图片描述

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,10)
plt.plot(x,x**3,label='333')
plt.plot(x,x**4,label='44')
plt.plot(x,x**5,label='55')
plt.legend(loc=0,ncol=2)   #图例的参数:位置参数——0、1,2,3,4(逆时针方向,0表示智能放置)
                        #ncol:表示图例的行数设置,这里表示设置为3列
plt.show()

在这里插入图片描述

13、创建时间数据,并进行展现

import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
import datetime

fig=plt.figure()   #创建一个画
start=datetime.datetime(2019,3,4)
stop=datetime.datetime(2019,5,7)
delta=datetime.timedelta(days=5)    #间隔为5
dates=mpl.dates.drange(start,stop,delta)   #相当于创建x数据

y=np.random.rand(len(dates))
ax=plt.gca()   #获得坐标轴,可以进行修改
ax.plot_date(dates,y,linestyle='--')

date_format=mpl.dates.DateFormatter('%Y-%m')   #修改日期的表现形式为中文形式
ax.xaxis.set_major_formatter(date_format)    #提交修改
fig.autofmt_xdate()   #x轴的标记进行自适应
ax.grid()
plt.show()

在这里插入图片描述

14、添加新的坐标轴

核心:twinx

import matplotlib.pyplot as plt
import numpy as np

x=np.arange(1,10)
y1=x**3
y2=np.log(x*3)
plt.plot(x,y1)
plt.twinx()   #新添加了一个坐标轴
plt.plot(x,y2,color='r')
#plt.ylabel="Y1"
plt.show()

plt的方式不能同时对两个图像进行设置x、y坐标,而面向对象的方法可以

在这里插入图片描述
面向对象:

import matplotlib.pyplot as plt
import numpy as np

x=np.arange(1,10)
y1=x**3
y2=np.log(x*3)
fig=plt.figure()
ax1=fig.add_subplot(111)
ax1.plot(x,y1)
ax1.set_ylabel('Y1')
ax2=ax1.twinx()    #也有twiny
ax2.set_ylabel('Y2')
ax2.plot(x,y2,'g')
ax1.set_xlabel("Compare Y1 and Y2")
plt.show()
 

在这里插入图片描述

15、颜色填充

以sin函数为例

import numpy as np
import matplotlib.pyplot as plt
x=np.linspace(0,5*np.pi,1000)  #步长不为整数
y1=np.sin(x)
y2=np.sin(2*x)
# plt.plot(x,y1)   #有了fill,这个就可以不写
plt.fill(x,y1,color='b',alpha=0.2)
# plt.plot(x,y2)
plt.fill(x,y2,color='g',alpha=0.2)
plt.fill_between(x,y1,y2,color='r',alpha=0.2)

plt.fill_between(x,y1,y2,where=y1>y2,color='r',alpha=0.2)
plt.fill_between(x,y1,y2,where=y1<y2,color='y',alpha=0.2)

plt.grid()
plt.show()

有了fill之后,可以不再写plot
Plt.fill_between是填充两个函数图像交叉部分,这里还可以设置条件,来填充上不同的颜色(因为这儿设置了透明度,多个颜色叠加存在着一个融合的现象)

在这里插入图片描述

16、设置x、y轴显示范围

两种方式:axis、xlim(ylim)
面向对象的是set_xlim、set_ylim

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(-10,11)
plt.plot(x,x**2)
# plt.axis([-12,12,0,100])
# print(plt.axis())   #(-10.95, 9.95, -5.0, 105.0)  x的最大小值,y的最大小值,可以据此进行修改

plt.xlim(left=1,right=11)
plt.ylim(bottom=2,top=50)
plt.show()

在这里插入图片描述

17、图上写文字

关键:plt.text、bbox、facecolor(前景色) 粗体的设置是通过wieght进行的
需要通过设置xy来确定文字的位置
数学公式的引用,python是引入了tex方式的,写之前,避免转义字符,需要设置r,数学公式的书写用$$

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(-10,10)
y=x**2
plt.plot(x,y)
plt.text(0,40,'function=x**2',family='serif',size=20,color='g',style='italic',weight=1000)   #x,y,文字,字体类型,大小,颜色,字体形状(斜体)
plt.text(1,20,'wwwwe',family='sans-serif',size=20,color='r',bbox=dict(facecolor='b',alpha=0.2))    #weight加粗,bbox做一个框
plt.text(2,60,'wwwwe',family='fantasy',size=20,color='b')    #手写的感觉
plt.text(1,80,r"$\sigma _{\max}=\frac{\sigma _{xx}+\sigma _{yy}}{2}+\frac{1}{2}\sqrt{\left( \sigma _{xx}-\sigma _{yy} \right) ^2+4\tau _{xy}^2}$")
plt.show()

在这里插入图片描述

18、图像上画标签箭头

import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,20)
y=x**2-10
plt.plot(x,y)
plt.annotate("this is botton",xy=(2,10),xytext=(2,100),      family='fantasy',size=20,color='b',arrowprops=dict(facecolor='r',headlength=20,headwidth=10,width=5))
plt.show()

xy:决定注释的顶点位置
xytext:决定文字的位置,以及注释的长度
arrowprops:决定注释的样式(箭头),颜色,头的长度、头的宽度、主体的宽度

在这里插入图片描述

19、雷达图

import matplotlib.pyplot as plt
import numpy as np
r=np.arange(1,11)    #rangge是左开右闭的区间
# theta=[0,np.pi/2,np.pi,3*np.pi/2,2*np.pi]
theta=np.linspace(0,2*np.pi,10)
fig=plt.figure()
ax=fig.add_subplot(111,projection='polar')   #投影:极坐标
ax.plot(theta,r,color='r')
ax.grid(True)
plt.show()

#rangge是左开右闭的区间,(1,10),则只有9个值,因此需要设置为(1,11)
重点:projection=‘polar’
在这里插入图片描述
设置一个闭合的雷达图,重点是最后一个数的坐标要和第一个的一样

import matplotlib.pyplot as plt
import numpy as np
r=[5,5,5,5,5,5,5,5,5,5]
theta=[0,np.pi/2,np.pi,3*np.pi/2,2*np.pi]
theta=np.linspace(0,2*np.pi,10)
fig=plt.figure()
ax=fig.add_subplot(111,projection='polar')   #投影:极坐标
ax.plot(theta,r,color='r')
ax.grid(True)
plt.show()

在这里插入图片描述

20、函数积分图

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

def func(x):
    return -(x-2)*(x-8)+40

x=np.linspace(0,10)
y=func(x)
fig=plt.figure()
ax=fig.add_subplot(111)
plt.plot(x,y,'r',linewidth=2)

a=2
b=9
ax.set_xticks([a,b])   #设置x、y的值,逐个设置,非区间
ax.set_yticks([])
ax.set_xticklabels(['$a$','$b$'])   #设置x、y的标签数值
plt.figtext(0.9,0.08,'$x$')   #介于xy0-1,1是最右边,0是最左边,设置xy的坐标轴标签
plt.figtext(0.1,0.9,'$y$')

#制作阴影
ix=np.linspace(a,b)   #按照默认来进行划分,划分为50等分
iy=func(ix)
ixy=zip(ix,iy)  #将ix与iy组合起来
vertss=[(a,0)]+list(ixy)+[(b,0)]   #一个面的基本要素
poly=Polygon(vertss,facecolor='0.9',edgecolor='0.5')  #组合成一个面,并设置其属性
ax.add_patch(poly)   #添加进图形中

ax.text(5,40,'wewc',size=20)
plt.show()

xtick不同于xlim,xlim设置的是区间,而xtick是精确到了区间上具体的值,若是用数组,则是具体的值,若是单纯的数字则表示为几等分(见下面的球员能力雷达图)

21、球员能力图

这里的能力值均是由随机数产生的,非真实情况

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties

plt.style.use('ggplot')   #风格的设置:灰色

font=FontProperties(fname=r'c:\windows\fonts\simkai.ttf',size=14)  #由于matplot自身的问题,因此需要寻找识别字符

fig=plt.figure()
ax1=fig.add_subplot(221,projection='polar')
ax2=fig.add_subplot(222,projection='polar')
ax3=fig.add_subplot(223,projection='polar')
ax4=fig.add_subplot(224,projection='polar')

ability_label=[u'进攻',u'防守',u'盘带',u'速度',u'体力',u'射术']    #字符问题,这里u必须加上
ability_size=6

player={
    '梅西':np.random.randint(size=ability_size,low=60,high=99),
    '哈维':np.random.randint(size=ability_size,low=60,high=99),
    '皮克':np.random.randint(size=ability_size,low=60,high=99),
    '切赫':np.random.randint(size=ability_size,low=60,high=99),
}
theta=np.linspace(0,2*np.pi,6,endpoint=False)   #endpoint : 如果True,'stop'是最后一个样本。否则,它不包括在内。默认为True。
                                                #这里是要闭合的

theta=np.append(theta,theta[0])   #这里左边的theta相当于是另外设置了标签,数组的追加需要全部加上=原先的+新来的
player['梅西']=np.append(player['梅西'],player['梅西'][0])
# ax1.plot(theta,player['梅西'],'r')
ax1.fill(theta,player['梅西'],'r',alpha=0.3)
ax1.set_xticks(theta)  #由八等分换成六等分,并设置角度
ax1.set_xticklabels(ability_label,FontProperties=font,color='g')   #不再是角度,而是中文字符,因为字符不被识别,因此前面需要进行转码
ax1.set_title('梅西',position=(0.5,1.05),FontProperties=font,size=20,color='r')
ax1.set_yticks=[20,40,60,80]    #强行确定y值

player['哈维']=np.append(player['哈维'],player['哈维'][0])
# ax1.plot(theta,player['哈维'],'r')
ax2.fill(theta,player['哈维'],'g',alpha=0.3)
ax2.set_xticks(theta)  #由八等分换成六等分,并设置角度
ax2.set_xticklabels(ability_label,FontProperties=font,color='g')   #不再是角度,而是中文字符,因为字符不被识别,因此前面需要进行转码
ax2.set_title('哈维',position=(0.5,1.05),FontProperties=font,size=20,color='r')    #position调整的是标题的位置,xy的比例

player['皮克']=np.append(player['皮克'],player['皮克'][0])
# ax1.plot(theta,player['哈维'],'r')
ax3.fill(theta,player['皮克'],'y',alpha=0.3)
ax3.set_xticks(theta)  #由八等分换成六等分,并设置角度
ax3.set_xticklabels(ability_label,FontProperties=font,color='g')   #不再是角度,而是中文字符,因为字符不被识别,因此前面需要进行转码
ax3.set_title('皮克',position=(0.5,0.98),FontProperties=font,size=20,color='r')

player['切赫']=np.append(player['切赫'],player['切赫'][0])
# ax1.plot(theta,player['哈维'],'r')
ax4.fill(theta,player['切赫'],'b',alpha=0.3)
ax4.set_xticks(theta)  #由八等分换成六等分,并设置角度
ax4.set_xticklabels(ability_label,FontProperties=font,color='g')   #不再是角度,而是中文字符,因为字符不被识别,因此前面需要进行转码
ax4.set_title('切赫',position=(0.5,0.98),FontProperties=font,size=20,color='r')
plt.show()

在这里插入图片描述

谢谢大家,欢迎评论,未得作者同意,不得转载本文。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值