数据可视化:
指的是通过可视化表示来探索数据,他与数据分析紧密相关,而数据分析指的是使用代码来探索数据集的规律和关联,数据集可以是用一行代码就能表示的小型数字列表,也可以是数千兆字节的数据。
绘制简单的折线图:
举例:
使用Matplotlib绘制简单的图表,我们只需要提供数,Matplotlib会完成这项工作:
import matplotlib.pyplot as plt#导入pyplot模块,其中包含很多用于生成图表函数
squares=[1,4,9,16,25]
fig,ax=plt.subplots()#fig表示整张图片,ax表示图片中的各个图表
#调用函数subplots
ax.plot(squares)#调用方法plot(),它尝试根据给定的数据以有意义的方式绘制图表
plt.show()#打开Matplotlib查看器并显示绘制的图表
修改标签文字和线条粗细:
现在我们通过修改代码,来改善该图表的可读性:
import matplotlib.pyplot as plt
squares=[1,4,9,16,25]
fig,ax=plt.subplots()
ax.plot(squares,linewidth=3)
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("value",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)
ax.tick_params(axis='both',labelsize=14)
plt.show()
通过输出结果我们发现,轴的标题为英文的被很好地显示出来,而轴的标题为中文的却是以乱码的形式被显示出来。
为什么会出现乱码呢?
这是由于用户配置的原因,matlab找不到默认字体,于是使用了Helvetica字体。
如何解决这个问题呢?
我们可通过修改plt的配置参数来满足画图需求,修改参数方法如下:
plt.rcParams[‘配置参数’]=[修改值]
上述实例可修改为:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#运行配置参数中的字体(font)为黑体(SimHei)
squares=[1,4,9,16,25]
fig,ax=plt.subplots()
ax.plot(squares,linewidth=3)
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("value",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)
ax.tick_params(axis='both',labelsize=14)
plt.show()
其他字体的值为:
新细明体:PMingLiU
细明体:MingLiU
标楷体:DFKai-SB
黑体:SimHei
宋体:SimSun
新宋体:NSimSun
仿宋:FangSong
楷体:KaiTi
仿宋_GB2312:FangSong_GB2312
楷体_GB2312:KaiTi_GB2312
微软正黑体:Microsoft JhengHei
微软雅黑体:Microsoft YaHei
可选择适合的字体显示中文
校正图形:
图像变得更加清晰了之后,相信细心的小伙伴已经看出了我们绘制的数据是有问题的,折线所显示的4.0的平方和竟然为25!
下面我们来修复这个问题,现在我们向plot()提供一系列数,它假设第一个数据对应的x轴坐标为0,但这里第一个点对应的x值为1,为改变这种默认行为,可向plot()同时提供输入和输出值。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#运行配置参数中的字体(font)为黑体(SimHei)
input_values=[1,2,3,4,5]#提供平方数对应的值
squares=[1,4,9,16,25]
fig,ax=plt.subplots()
ax.plot(input_values,squares,linewidth=3)
---snip---
使用内置样式:
Matplotlib提供了很多已经定义好的样式,例如:背景色,网格线,线条粗细,字体,字号等的设置。
举例:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#运行配置参数中的字体(font)为黑体(SimHei)
plt.rcParams['axes.facecolor']='yellow'#设置图表的背景颜色为黄色
plt.rcParams['figure.facecolor']='green'#设置整张图片的背景颜色为绿色
---snip---
导出matplotlib所包含的所有内置样式:
import matplotlib.pyplot as plt
from matplotlib import style
print(plt.style.available)
['Solarize_Light2', '_classic_test_patch', '_mpl-gallery', '_mpl-gallery-nogrid', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']
使用scatter()绘制散点图并设置样式:
对于数据涉及范围较大的情况下,如果我们想实现不同范围内的数据使用不同的颜色,此时就可以使用scatter()来设置单个点,使用方法:
ax.scatter(x坐标,y坐标)
import matplotlib.pyplot as plt
plt.style.use("seaborn")#选用网格样式
fig,ax=plt.subplots()
ax.scatter(2,4)#绘制我们传递的指定点(2,4)
plt.show()
ax.scatter(2,4,s=200)#通过第三个参数s,我们还可以指定点的尺寸大小
设置刻度标记的大小:
import matplotlib.pyplot as plt
plt.style.use("seaborn-dark")
fig,ax=plt.subplots()
ax.scatter(2,4,s=200)
#axis表示x轴和y轴同时设置labelsize用于设置刻度线标签的字体大小
ax.tick_params(axis='both',which="major",labelsize=14)#which一共三个参数['major','minor','both']
#默认是major表示主刻度,后面依次分布为次刻度及主次刻度都显示
plt.show()
使用scatter()绘制一系列的点:
要绘制一系列的点,可向scatter()传递两个分别包含x值和y值的列表,如下图示:
import matplotlib.pyplot as plt
#将要设置的值通过列表存储起来
x_values=[1,2,3,4,5]
y_values=[1,4,9,16,25]
plt.style.use("seaborn")
fig,ax=plt.subplots()
ax.scatter(x_values,y_values,s=100)#将x_values和y_values中所包含的点都设置
plt.show()
自动计算数据:
当绘制的点很多时,手工计算列表要包含的值效率会比较低,但好在Python可以通过循环帮助我们实现这一功能。
下面我们增加数据:
import matplotlib.pyplot as plt
x_values=range(1,1001)#使用循环确定横坐标的值
y_values=[x**2 for x in x_values]#纵坐标的值为x的平方,而x为x_values里面的值
plt.style.use("seaborn")
fig,ax=plt.subplots()
ax.scatter(x_values,y_values,s=100)
ax.axis([0,1100,0,1100000])#设置每个坐标轴的取值范围:x的取值范围:0---1100,y的取值范围0----1 100 000
plt.show()
自定义颜色:
要修改数据点的颜色,可向scatter()传递参数c,并将其设置为要使用的颜色的名称(放在引号内),如下所示:
import matplotlib.pyplot as plt
x_values=range(1,1001)
y_values=[x**2 for x in x_values]
plt.style.use("seaborn")
fig,ax=plt.subplots()
ax.scatter(x_values,y_values,c='yellow',s=10)#c="需要设置的颜色”
plt.show()
此外,我们还可使用RGB颜色模式自定义颜色,要指定自定义颜色,可传递参数c,并将其设置为一个元祖,其中包含三个0-1的数值,分别表示红色,绿色和蓝色的分量。
举例:
ax.scatter(x_values,y_values,c=(1,0.3,0。6),s=10)#通过调整c中三个参数的值来调节颜色的深度,这三个参数分别表示红色,绿色和蓝色的分量
#值越接近0,指定的颜色越深,值越接近1,指定的颜色越浅
使用颜色映射:
颜色映射是一系列颜色,从起始颜色渐变到结束颜色,在可视化中,颜色映射用于突出数据的规律,例如,你可以用较浅的值来显示较小的值,并且使用较深的值显示较大的值。
模块pyplot内置了一组颜色映射,要使用这些颜色映射,需要告诉pyplot该如何设置数据集中每个点的颜色。
举例:
import matplotlib.pyplot as plt
x_values=range(1,1001)
y_values=[x**2 for x in x_values]
plt.style.use("seaborn")
fig,ax=plt.subplots()
ax.scatter(x_values,y_values,c=y_values,cmap=plt.cm.Reds,s=10)#使用参数cmap告诉pyplot使用那个颜色进行映射
#将y值较小的设置为粉色,较大的设置为红色
plt.show()
如下图所示:
如果你还想了解pyplot中所有的颜色映射,可通过访问Matplotlib网站主页,单击Examples,向下滚动到color,再单击Colormaps reference
访问主页:
在Examples中找到color,再点击color reference:
各种颜色显而易见:
自动保存图表:
要让程序自动将图表保存到文件中,可将调用plt.savefig():
#第一个参数(squres_plot.png)指定以什么文件名保存图表,执行代码后,该图片会被保存到该项目的目录下
#第二个参数指定将图表多余的空白区域裁剪掉,如果想保留图表周围多余的空白区域,只需要省略这个实参即可
plt.savefig("squres_plot.png",bbox_inches="tight")
随机漫步:
随机漫步是这样行走得到路径的:每次行走都是完全随机的,没有明确的方向,结果是由一系列随机决策决定的,你可以将随机漫步看作蚂蚱在晕头转向的情况下,每次都沿随机的方向前行所经过的路径。
那么它到底有什么作用呢?
通过编写代码我们可以,模拟现实世界的很多情形,比如:漂浮在水滴上的花粉因不断受到水分子的挤压而在水上面移动,而水滴中的分子运动也是随机的,因此花粉在水面上的运动路径犹如随机漫步。
创建RandomWalk类:
为模拟随机漫步,将创建一个名为RandomWalk的类,它随机的选择前进方向,这个类具有三个属性:一个是存储随机漫步次数的变量,其他两个是列表,分别存储随机漫步经过的每个点的x坐标和y坐标。
RandomWalk类只包含两个方法:方法__init__()和fill_walk()
举例:
from random import choice
class RandonWalk:#表示随机漫步数据的类
def __init__(self,num_points=5000):#初始化随机漫步的属性
self.num_points=num_points
#所有的随机漫步都从坐标轴原点出发
self.x_values=[0]
self.y_values=[0]
选择方向:
使用RandomWalk类的另外一个方法,fill——walk()来决定每次漫步的方向。
举例:
def fill_walk(self):
#计算随机漫步包含的所有点:决定上向左右四个方向和行走的距离
while len(self.x_values,)<self.num_points:#不断漫步,直到列表达到指定的长度
#决定前进方向以及沿这个方向前进的距离
x_direction=choice([1,-1])
x_distance=choice([0,1,2,3,4])
#如果x_step为正向右移动,为负向左移动,为零垂直移动
x_step=x_direction*x_distance#距离*方向,确定x轴移动的距离
y_direction=choice([1,-1])
y_distance=choice([0,1,2,3,4])
#如果y_step为正向上移动,为负向下移动,为0水平移动
y_step=y_direction*y_distance#同理如上
if x_step==0 and y_step==0:#拒绝原地踏步
continue
#将x_step/y_step与x_values/y_values中的最后一个值相加,计算下一个点的x值和y值
x=self.x_values[-1]+x_step
y=self.y_values[-1]+y_step
self.x_values.append(x)#将计算好的值附加到列表中
self.y_values.append(y)
绘制随机漫步图:
代码:
#导入pyplot模块和RandomWalk类
import matplotlib.pyplot as plt
from project1 import RandomWalk
#创建关于RandomWalk的实例,并调用其中的方法
rw=RandomWalk()
rw.fill_walk()
plt.style.use("classic")#选择内置样式“classic”
fig,ax=plt.subplots()
ax.scatter(rw.x_values,rw.y_values,s=15,c="green")
plt.show()
模拟多次随机漫步:
要保证不使用多次运行程序的办法而实现用前面的代码模拟多次随机漫步,一种办法是将这些代码放在一个循环中:
操作如下:
keep_running=input("Make another walk?(y/n):")
if keep_running=='n':
break
添加该语句后,当进行一次随机漫步之后,在对话框就会出现:
Make another walk?(y/n):y#输入y,再进行一次随机漫步
Make another walk?(y/n):n#输入n,则结束漫步
设置随机漫步图的样式:
通过上图呈现的随机漫步的元素,我们不难发现元素分布非常的凌乱,这样就会导致我们在分析数据的时候很麻烦。
我们可将比较特殊的元素进行处理,比如漫步起点,终点的等等。
给点着色:
操作如下:
---snip---
fig,ax=plt.subplots()
point_numbers=range(rw.num_points)
ax.scatter(rw.x_values,rw.y_values,s=15,c=point_numbers,cmap=plt.cm.Blues,edgecolors="none")
#将参数c设置为point_numbers,指定使用颜色映射Blues,并将轮廓删除
plt.show()
---snip---
重新绘制起点和终点:
操作如下:
#突出起点和终点,通过使用scatter(),设置单独的点
ax.scatter(0,0,c="green",edgecolors="none",s=100)#设置起点的值
ax.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolor="none",s=100)#设置终点的值
隐藏坐标轴:
要隐藏坐标轴,可使用如下代码:
#将每条坐标轴的可见性都设置为Faslse
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
输出如图所示:
增加点数:
为提供更多的数据,我们可在创建实例的时候增大num_points的值,并在绘图时调整每个点的大小:
import matplotlib.pyplot as plt
from project1 import RandomWalk
while True:
rw=RandomWalk(50_000)#描绘5w个点
rw.fill_walk()
plt.style.use("classic")
fig,ax=plt.subplots()
point_numbers=range(rw.num_points)
ax.scatter(rw.x_values,rw.y_values,s=15,c=point_numbers,cmap=plt.cm.Blues,edgecolors="none")
ax.scatter(0,0,c="green",edgecolors="none",s=1)#将点的大小设置为1
---snip---
调整尺寸以适合屏幕:
通过直接指定图表的尺寸大小,即给figsize指定一个元祖,通过参数dpi向plt.subplots()传递该分辨率。
举例:
fig,ax=plt.subplots(figsize=(10,6),dpi=128)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81475.html