第十五章:生成数据

版权声明:作者:小白 https://blog.csdn.net/weixin_43687366/article/details/88815706

 前言:

数据可视化指的是通过可视化表示来探索数据,它与数据挖掘紧 密相关,而数据挖掘指的是使用代码来探索数据集的规律和关联。数 据集可以是用一行代码就能表示的小型数字列表,也可以是数以吉字 节的数据。 

漂亮地呈现数据关乎的并非仅仅是漂亮的图片。以引人注目的简 洁方式呈现数据,让观看者能够明白其含义,发现数据集中原本未意 识到的规律和意义。

 一、matplotlib 画廊

使用matplotlib可制作的各种图表

# # _*_ coding:utf-8 _*_
# import matplotlib.pyplot as plt
# squares = [1,4,9,16,25]
# plt.plot(squares,linewidth=5)
#
# #设置图表的标题,并给坐标轴加上标签
# plt.title("Square Numbers",fontsize=24)
# plt.xlabel("value",fontsize=14)
# plt.ylabel("Square of Value",fontsize=14)
#
# #设置刻度标记的大小
# plt.tick_params(axis='both',labelsize=14)
# plt.show()

import matplotlib.pyplot as plt
input_values = [1,2,3,4,5]
squares = [1,4,9,16,25]
plt.plot(input_values,squares,linewidth=5)

# plt.title("Squares Numbers",fontsize=24)
# plt.xlabel("value",fontsize=14)
# plt.ylabel("Square of value",fontsize=14)

plt.tick_params(axis='both',labelsize=14)
plt.show()

结果图:

二、使用scatter()绘制散点图并设置其样式 

有时候,需要绘制散点图并设置各个数据点的样式。例如,你可能想以一种颜色显示较小的 值,而用另一种颜色显示较大的值。绘制大型数据集时,你还可以对每个点都设置同样的样式, 再使用不同的样式选项重新绘制某些点,以突出它们。 

# _*_ coding:utf-8 _*_
# import matplotlib.pyplot as plt
# plt.scatter(2,4,s=200)  #s=200尺寸,它传递一对x和y坐标
#
# #设置图表标题并给坐标轴加上标签
# plt.title("Squares Numbers",fontsize=24)
# plt.xlabel("Value",fontsize=14)
# plt.ylabel("Square of Value",fontsize=14)
#
# #设置刻度标记的大小
# plt.tick_params(axis='both',which='major',labelsize=14)
# plt.show()

import matplotlib.pyplot as plt
x_values = [1,2,3,4,5]
y_values = [1,4,9,16,25]
plt.scatter(x_values,y_values,s=100)
#将 这些列表传递给scatter()时,matplotlib依次从每个列表中读取一个值来绘制一个点。要绘制的 点的坐标分别为 (1, 1)、(2, 4)、(3, 9)、(4, 16)和(5, 25)
plt.show()

结果如下:

三、自动计算数据

手工计算列表要包含的值可能效率低下,需要绘制的点很多时尤其如此。可以不必手工计算 包含点坐标的列表,而让Python循环来替我们完成这种计算。下面是绘制1000个点的代码: 

# _*_ coding:utf-8 _*_
import matplotlib.pyplot as plt
x_values = list(range(1,1001))#1到1000
y_values = [x**2 for x in x_values]
# plt.scatter(x_values,y_values,edgecolors=None,color='red',s=40)
#删除数据点的轮廓edgecolors=None,颜色color='red'
plt.scatter(x_values,y_values,edgecolors=None,color=(0,0,0.8),s=40)
#color=(0,0,0.8)分别代表红色、绿色、蓝色分量,值越接近0,指定的颜色越深,值越接近1,指定的颜色越浅。

plt.title("Squares",fontsize=24)
plt.xlabel("values",fontsize=14)
plt.ylabel("squares",fontsize=14)

#设置参数
plt.tick_params(axis=1,which='both',labelsize=14)

## 设置每个坐标轴的取值范围函数axis()指定了每个坐标轴的取值范围
plt.axis([0,1100,0,1100000])
plt.show()

结果如下:

四、颜色映射

# _*_ coding:utf-8 _*_
#颜色映射(colormap)是一系列颜色,它们从起始颜色渐变到结束颜色。在可视化中,颜色 映射用于突出数据的规律,例如,你可能用较浅的颜色来显示较小的值,并使用较深的颜色来显 示较大的值。 模块pyplot内置了一组颜色映射。要使用这些颜色映射,你需要告诉pyplot该如何设置数据 集中每个点的颜色。
import matplotlib.pyplot as plt
x_values = list(range(1001))
y_values = [x**2 for x in x_values]

plt.scatter(x_values,y_values,c=y_values,cmap=plt.cm.Blues,edgecolors='none',s=40)

plt.title("SQUAREs",fontsize=24)
plt.xlabel("Values",fontsize=14)
plt.ylabel("Squares of Values",fontsize=14)

plt.tick_params(axis=0,which='both',labelsize=14)


# plt.show()

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

结果如下:

squares_plot.png

五、随机漫步

我们将使用Python来生成随机漫步数据,再使用matplotlib以引人瞩目的方式将这 些数据呈现出来。随机漫步是这样行走得到的路径:每次行走都完全是随机的,没有明确的方向, 结果是由一系列随机决策决定的。你可以这样认为,随机漫步就是蚂蚁在晕头转向的情况下,每次都沿随机的方向前行所经过的路径。 

1、创建RandomWalk()类 

# _*_ coding:utf-8 _*_
from random import choice
import matplotlib.pyplot as plt

class RandomWalk():
	"""一个生成随机漫步数据的类"""
	def __init__(self,num_points=5000):
		self.num_points = num_points
		
		#初始化随机漫步属性,开始于(0,0)
		self.x_values = [0]
		self.y_values = [0]
		
# list = RandomWalk()
# print(str(list))

	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_direction*x_distance
			
			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值
			next_x = self.x_values[-1]+x_step
			next_y = self.y_values[-1]+y_step
			
			self.x_values.append(next_x)
			self.y_values.append(next_y)
			

2、绘制随机漫步图

# _*_ coding:utf-8 _*_
import matplotlib.pyplot as plt
from random_walk import RandomWalk

## 创建一个RandomWalk实例,并将其包含的点都绘制出来
## 只要程序处于活动状态,就不断地模拟随机漫步
while True:
	# 创建一个RandomWalk实例,并将其包含的点都绘制出来
	rw = RandomWalk(50000)
	rw.fill_walk()
	
	#设置绘图窗口的尺寸
	#figure用于指定图表的宽度、高度、分辨率和背景色
	plt.figure(figsize=(10,6))
	#dpi为传递分辨率
	plt.figure(dpi=128,figsize=(10,6))
	
	point_numbers = list(range(rw.num_points))
	plt.scatter(rw.x_values,rw.y_values,c=point_numbers,cmap=plt.cm.Blues,edgecolors='none',s=15)
	
	"""突出起点和终点"""
	plt.scatter(0,0,c='green',edgecolors='none',s=10)
	plt.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolors='none',s=100)
	
	
	"""隐藏坐标轴"""
	plt.axes().get_xaxis().set_visible(False)
	plt.axes().get_yaxis().set_visible(False)
	
# plt.title("RandomWalk",fontsize=24)
# plt.xlabel("Values",fontsize=14)
# plt.ylabel("Random",fontsize=14)
# plt.tick_params(axis=0,which='both',labelsize=14)
	
	#在显示之前保存就不会出现空白的情况
	plt.savefig("chukai.png",transparent=False,dpi=300,pad_inches=0)
	plt.show()
# plt.savefig('squares_plot.png',bbox_inches='tight')

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

结果如下:

 六、使用Pygal模拟掷骰子 

1、创建die类

# _*_ coding:utf-8 _*_
from random import randint
class Die():
	def __init__(self,num_sides=6):
		"""六个面"""
		self.num_sides = num_sides
		
	def roll(self):
		""""返回一个位于1和骰子面数之间的随机值"""
		return randint(1,self.num_sides)

2、掷骰子 

# _*_ coding:utf-8 _*_
from die import Die
import pygal
#创建一个D6
die = Die()

results = []
for roll_num in range(100):
	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)

#对结果可视化
hist = pygal.Bar()
hist.title = "Results of rolling one D6 1000 times"
hist.x_labels = ['1','2','3','4','5','6']
hist.y_labels = [i for i in range(40)]
hist.x_title = "Result"
hist.y_title = "Frequency of Result"

hist.add('D6',frequencies)
hist.render_to_file("die_visual.svg")
#.svg可缩放的矢量图形格式


print(results)

3、两个骰子

# _*_ coding:utf-8 _*_
import pygal
from die import Die

#创建两个骰子
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)
	
#可视化
hist = pygal.Bar()

hist.title = "Results of rolling two D6 dice 1000 times."
hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12']
hist.x_title = "Result"
hist.y_title = "Frequencies of Result"

hist.add('D6 + D6',frequencies)
hist.render_to_file('dice_visual.svg')

4、两个不同的骰子

# _*_ coding:utf-8 _*_
from die import Die
import pygal

#创建一个D6和D10
die_1 = Die()
die_2 = Die(10)


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

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


#可视化
hist = pygal.Bar()

hist.title = "Results of rolling a D6 and a D10 5000 times"
hist.x_labels = ['2','3','4','5','6','7','8','9','10','11','12','13','14','15','16']
hist.x_title = "Results"
hist.y_title = "Frequency of result"

hist.add('D6 + D10',frequencies)
hist.render_to_file('different_dice_visual.svg')

猜你喜欢

转载自blog.csdn.net/weixin_43687366/article/details/88815706