《Python编程从入门到实践 第二版》项目2 数据可视化

该博客介绍了使用Python进行数据可视化的实践,包括使用Matplotlib绘制折线图、散点图,调整图形样式,以及通过Plotly模拟随机漫步和掷骰子。内容涵盖修改标签、线条样式、颜色映射、自动生成数据,以及随机漫步和骰子游戏的可视化分析。

第 15 章 生成数据

软件准备

  • 安装Matplotlib
  • 安装ploty
pip install matplotlib

pip install plotly

15.2 绘制简单的折线图

mpl_squares.py

import matplotlib.pyplot as plt 

squares = [1,4,9,16,25]

# 变量fig 表示整张图片,变量ax表示图片中的各个图表
fig, ax = plt.subplots()
ax.plot(squares)

# 打开Matplotlib查看器并显示绘制的图表
plt.show()

运行结果:
在这里插入图片描述

15.2.1 修改标签文字和线条粗细
import matplotlib.pyplot as plt 

squares = [1,4,9,16,25]

# 变量fig 表示整张图片,变量ax表示图片中的各个图表
fig, ax = plt.subplots()
ax.plot(squares,linewidth=3)

# 设置图表标题并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

# 设置刻度标记的大小
ax.tick_params(axis='both',labelsize=14)

# 打开Matplotlib查看器并显示绘制的图表
plt.show()

运行结果:

加粗样式

15.2.2 校正图形
import matplotlib.pyplot as plt 

input_values = [1,2,3,4,5]
squares = [1,4,9,16,25]

# 变量fig 表示整张图片,变量ax表示图片中的各个图表
fig, ax = plt.subplots()
ax.plot(input_values,squares,linewidth=3)

# 设置图表标题并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

# 设置刻度标记的大小
ax.tick_params(axis='both',labelsize=14)

# 打开Matplotlib查看器并显示绘制的图表
plt.show()

运行结果:
在这里插入图片描述

15.2.3 使用内置样式
import matplotlib.pyplot as plt 

input_values = [1,2,3,4,5]
squares = [1,4,9,16,25]

# 变量fig 表示整张图片,变量ax表示图片中的各个图表
plt.style.use('seaborn')
fig, ax = plt.subplots()
ax.plot(input_values,squares,linewidth=3)

# 设置图表标题并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

# 设置刻度标记的大小
ax.tick_params(axis='both',labelsize=14)

# 打开Matplotlib查看器并显示绘制的图表
plt.show()

运行结果:
在这里插入图片描述

15.2.4 使用scatter() 绘制散点图并设置样式

catter_squares.py

import matplotlib.pyplot as plt 

plt.style.use('seaborn')
fig, ax = plt.subplots()
ax.scatter(2,4,s=200) # 加上标签,并确保所有文本都达到能够看清

# 设置图表标题并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

# 设置刻度标记的大小
ax.tick_params(axis='both',which='major',labelsize=14)


plt.show()

运行结果:
在这里插入图片描述

15.2.5 使用scatter() 绘制一系列点

scatter_squares.py

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)

# 设置图表标签并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

plt.show()

运算结果:
在这里插入图片描述

15.2.6 自动计算数据

scatter_squares.py

import matplotlib.pyplot as plt

# x_values = [1,2,3,4,5]
# y_values = [1,4,9,16,25]

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,s=100)
ax.scatter(x_values,y_values,s=10)  # 将点设置得较小


# 设置图表标签并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

# 设置每个坐标轴的取值范围
ax.axis([0,1100,0,1100000])


plt.show()

运行结果:
在这里插入图片描述

15.2.7 自定义颜色
  • 值越接近0,指定的颜色越深;值越接近1,指定的颜色越浅。
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=(0,0.8,0),s=10)
# ax.scatter(x_values,y_value,s='green',s=10)也可以

# 设置图表标签并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

# 设置每个坐标轴的取值范围
ax.axis([0,1100,0,1100000])


plt.show()

运行结果:
在这里插入图片描述

15.2.8 使用颜色映射
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.Blues,s=10)

# 设置图表标签并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

# 设置每个坐标轴的取值范围
ax.axis([0,1100,0,1100000])

plt.show()

运行结果:
在这里插入图片描述
注意
要了解pyplot 中所有的颜色映射,请访问Matplotlib网站主页,单击Examples,向下滚动到Color,再单击Colormaps reference。

15.2.9 自动保存图表
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.Blues,s=10)

# 设置图表标签并给坐标轴加上标签
ax.set_title("平方数",fontsize=24)
ax.set_xlabel("值",fontsize=14)
ax.set_ylabel("值的平方",fontsize=14)

# 设置每个坐标轴的取值范围
ax.axis([0,1100,0,1100000])

# 第一个实参指定要以什么文件名保存图表,这个文件将存储到scatter_squares.py所在的目录。第二个实参指定将图表多余的空白区域裁剪掉。如果要保留图表周围多余的空白区域,只需省略这个实参即可。
plt.savefig('squares_plot.png',bbox_inches='tight')

15.3 随机漫步

15.3.1 创建RandomWalk 类

random_walk.py

from random import choice

class RandomWalk():
	"""一个生成随机漫步数据的类"""
	def __init__(self, num_points=5000):
		"""初始化随机漫步的属性"""		
		self.num_points = num_points

		# 所有随机漫步都始于(0,0)
		self.x_values = [0]
		self.y_values = [0]
15.3.2 选择方向
from random import choice

class RandomWalk():
	"""一个生成随机漫步数据的类"""
	def __init__(self, num_points=5000):
		"""初始化随机漫步的属性"""		
		self.num_points = num_points

		# 所有随机漫步都始于(0,0)
		self.x_values = [0]
		self.y_values = [0]

	def fill_walk(self):
		"""计算随机漫步包含的所有点"""

		# 不断漫步,直到列表达到指定的长度
		while len(self.x_values) < self.num_points:

			# 决定前进方向以及沿这个方向前进的距离
			x_direction = choice([1,-1])

			# 如果x_step 为正将向右移动,为负将向左移动,为零将垂直移动
			x_distance = choice([0,1,2,3,4])
			x_step = x_direction * x_distance

			# 如果y_step 为正将向上移动,为负将向下移动,为零将水平移动
			y_direction = choice([1,-1])
			y_distance = choice([0,1,2,3,4])
			y_step = y_direction * y_distance

			# 拒绝原地踏步
			if x_step == 0 and y_step == 0:
				continue

			# 计算下一个点的x值和y值
			x = self.x_values[-1] + x_step
			y = self.y_values[-1] + y_step
			
			# 获得下一个点的x值和y值后,将它们分别附加到列表x_values 和y_values 的末尾
			self.x_values.append(x)
			self.y_values.append(y)
15.3.3 绘制随机漫步图

rw_visual.py

import matplotlib.pyplot as plt 

from random_walk import RandomWalk

# 创建一个RandomWalk实例
rw = RandomWalk()
rw.fill_walk()
# 将所有的点都绘制出来
plt.style.use('classic')
fig,ax = plt.subplots()
ax.scatter(rw.x_values,rw.y_values,s=15)
plt.show()
15.3.4 模拟多次随机漫步
import matplotlib.pyplot as plt 

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断地模拟随机漫步
while True:
	# 创建一个RandomWalk实例
	rw = RandomWalk()
	rw.fill_walk()
	
	# 将所有的点都绘制出来
	plt.style.use('classic')
	fig,ax = plt.subplots()
	ax.scatter(rw.x_values,rw.y_values,s=15)
	plt.show()

	# 要结束程序,请输入 n
	keep_running = input("Make another walk?(y/n): ")
	if keep_running == 'n':
		break
15.3.5 设置随机漫步图的样式
  • a. 给点着色
import matplotlib.pyplot as plt 

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断地模拟随机漫步
while True:
	# 创建一个RandomWalk实例
	rw = RandomWalk()
	rw.fill_walk()
	
	# 将所有的点都绘制出来
	plt.style.use('classic')
	fig,ax = plt.subplots()
	# 使用range() 生成了一个数字列表,其中包含的数与漫步包含的点数量相同
	point_numbers = range(rw.num_points)
	# 传递实参edgecolors='none' 以删除每个点周围的轮廓
	ax.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,edgecolors='none',s=15)
	plt.show()

	keep_running = input("Make another walk?(y/n): ")
	if keep_running == 'n':
		break
  • b. 重新绘制起点和终点
import matplotlib.pyplot as plt 

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断地模拟随机漫步
while True:
	# 创建一个RandomWalk实例
	rw = RandomWalk()
	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,c=point_numbers,cmap=plt.cm.Blues,edgecolors='none',s=15)

	# 突出起点和终点
	ax.scatter(0,0,c='green',edgecolors='none',s=100)
	ax.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolors='none',s=100)


	plt.show()

	keep_running = input("Make another walk?(y/n): ")
	if keep_running == 'n':
		break
  • c. 隐藏坐标轴
import matplotlib.pyplot as plt 

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断地模拟随机漫步
while True:
	# 创建一个RandomWalk实例
	rw = RandomWalk()
	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,c=point_numbers,cmap=plt.cm.Blues,edgecolors='none',s=15)

	# 突出起点和终点
	ax.scatter(0,0,c='green',edgecolors='none',s=100)
	ax.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolors='none',s=100)

	# 隐藏坐标轴
	ax.get_xaxis().set_visible(False)
	ax.get_yaxis().set_visible(False)

	plt.show()

	keep_running = input("Make another walk?(y/n): ")
	if keep_running == 'n':
		break
  • d. 增加点数
import matplotlib.pyplot as plt 

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断地模拟随机漫步
while True:
	# 创建一个RandomWalk实例
	rw = RandomWalk(50000)
	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,c=point_numbers,cmap=plt.cm.Blues,edgecolors='none',s=15)

	# 突出起点和终点
	ax.scatter(0,0,c='green',edgecolors='none',s=100)
	ax.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolors='none',s=100)

	# 隐藏坐标轴
	ax.get_xaxis().set_visible(False)
   	ax.get_yaxis().set_visible(False)

	plt.show()

	keep_running = input("Make another walk?(y/n): ")
	if keep_running == 'n':
		break
  • e. 调整尺寸以适合屏幕
import matplotlib.pyplot as plt 

from random_walk import RandomWalk

# 只要程序处于活动状态,就不断地模拟随机漫步
while True:
	# 创建一个RandomWalk实例
	rw = RandomWalk(50000)
	rw.fill_walk()
	
	# 将所有的点都绘制出来
	plt.style.use('classic')
	# 创建图表时,可传递参数figsize 以指定生成的图形的尺寸。需要给参数figsize 指定一个元组,向Matplotlib指出绘图窗口的尺寸,单位为英寸
	fig,ax = plt.subplots(figsize=(15,9))
	# Matplotlib假定屏幕分辨率为100像素/英寸。
	fig,ax = plt.subplots(figsize=(10,6),dpi=128)
	point_numbers = range(rw.num_points)
	ax.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,edgecolors='none',s=15)

	# 突出起点和终点
	ax.scatter(0,0,c='green',edgecolors='none',s=100)
	ax.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolors='none',s=100)

	# 隐藏坐标轴
	ax.get_xaxis().set_visible(False)
	ax.get_yaxis().set_visible(False)

	plt.show()

	keep_running = input("Make another walk?(y/n): ")
	if keep_running == 'n':
		break

15.4 使用Plotly模拟掷骰子

15.4.2 创建Die 类

die.py

from random import randint

class Die:
	"""表示一个骰子的类"""
	def __init__(self,num_sides=6 ):
		"""骰子默认为6面"""
		self.num_sides = num_sides

	def roll(self):
		"""返回一个位于1和骰子面数之间的随机值"""
		return randint(1,self.num_sides)
15.4.3 掷骰子

die_visual.py

from die import Die

# 创建一个D6
die = Die()

# 掷几次骰子并将结果存储在一个列表中。
results = []
for roll_num in range(100):
	result = die.roll()
	results.append(result)
print(results)
15.4.4 分析结果
from die import Die

# 创建一个D6
die = Die()

# 掷几次骰子并将结果存储在一个列表中。
results = []
for roll_num in range(1000):
	result = die.roll()
	results.append(result)


# 分析结果
frequencies = []
for value in range(1,die.num_sides+1):
	frequency = results.count(value)
	frequencies.append(frequency)
print(frequencies)

结果:

[164, 174, 188, 179, 147, 148]
[Finished in 1.0s]

有6个值,对应掷D6时可能出现的每个点数;另外,没有任何点数出现的频率比其他点数高很多。

15.4.5 绘制直方图
from die import Die
from plotly.graph_objs import Bar,Layout
from plotly import offline


# 创建一个D6
die = Die()

# 掷几次骰子并将结果存储在一个列表中。
results = []
for roll_num in range(1000):
	result = die.roll()
	results.append(result)


# 分析结果
frequencies = []
for value in range(1,die.num_sides+1):
	frequency = results.count(value)
	frequencies.append(frequency)

# 对结果进行可视化
x_values = list(range(1,die.num_sides+1))

# 将可能出现的点数(1到骰子的面数)存储在x_values的列表中
# Plotly不能直接接受函数range()的结果,因此需要函数list()将其转换为列表
# Plotly类Bar()表示用于绘制条形图的数据集,需要存储一个x值的列表和一个存储y值的列表,这个类必须放在括号内,因为数据集可能包含多个元素
data = [Bar(x=x_values,y=frequencies)]

# 每个坐标轴都能以不同的方式进行配置,而每个配置选项都是一个字典元素。这里只设置了坐标轴标签
x_axis_config = {'title': '结果'}
y_axis_config = {'title': '结果的频率'}
# 类Layout()返回一个指定图标布局和配置的对象
my_layout = Layout(title='掷一个D6 1000次的结果',xaxis=x_axis_config,yaxis=y_axis_config)
# 生成图表,需要包含一个包含数据和布局对象的字典,还接受一个文件名,指定图标保存到哪里
offline.plot({'data':data,'layout':my_layout},filename='d6.html')
	

结果:
在这里插入图片描述

15.4.6 同时掷两个骰子

dice_visual.py

from plotly.graph_objs import Bar,Layout
from plotly import offline

from die import Die

# 创建两个D6
die_1 = Die()
die_2 = Die()

# 掷几次骰子并将结果存储在一个列表中
results = []
for roll_num in range(1000):
	result = die_1.roll() + die_2.roll()
	results.append(result)

# 分析结果
frequencies = []
max_result = die_1.num_sides + die_2.num_sides
for value in range(2,max_result+1):
	frequency = results.count(value)
	frequencies.append(frequency)

# 可视化结果
x_values = list(range(2,max_result+1))
data = [Bar(x=x_values,y=frequencies)]

x_axis_config = {'title':'结果','dtick':1}
y_axis_config = {'title':'结果的频率'}
my_layout = Layout(title='掷两个D6 1000次的结果',xaxis=x_axis_config,yaxis=y_axis_config)
offline.plot({'data':data,'layout':my_layout},filename='d6_d6.html')

结果:
在这里插入图片描述
这个图表显示了掷两个D6时得到的大致结果。如你所见,总点数
为2或12的可能性最小,而总点数为7的可能性最大。这是因为在下面6种情况下得到的总点数都为7:1和6、2和5、3和4、4和3、5和2以及6和1。

15.4.7 同时掷两个面数不同的骰子
from plotly.graph_objs import Bar,Layout
from plotly import offline

from die import Die

# 创建一个D6和一个D10
die_1 = Die()
# 传递实参10,10面骰子
die_2 = Die(10)

# 掷几次骰子并将结果存储在一个列表中
results = []
for roll_num in range(50000):
	result = die_1.roll() + die_2.roll()
	results.append(result)

# 分析结果
frequencies = []
max_result = die_1.num_sides + die_2.num_sides
for value in range(2,max_result+1):
	frequency = results.count(value)
	frequencies.append(frequency)

# 可视化结果
x_values = list(range(2,max_result+1))
data = [Bar(x=x_values,y=frequencies)]

x_axis_config = {'title':'结果','dtick':1}
y_axis_config = {'title':'结果的频率'}
my_layout = Layout(title='掷一个D6和一个D10 50000次的结果',xaxis=x_axis_config,yaxis=y_axis_config)
offline.plot({'data':data,'layout':my_layout},filename='d6_d10.html')

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值