python项目-数据可视化-matplotlib和plotly绘图

发布时间 2023-04-11 10:09:23作者: 纸越

matplotlib和plotly绘图

参考书籍《Python编程 从入门到实践》

折线图

15-1 立方:数字的三次方被称为其立方。请绘制一个图形,显示前5 个整数的立方
值,再绘制一个图形,显示前5000 个整数的立方值。
15-2 彩色立方:给你前面绘制的立方图指定颜色映射。

import matplotlib.pyplot as plt

#设置字体为中文
plt.rcParams['font.sans-serif'] = 'SimHei'
#使用subplots()函数,变量fig表示整张图片,变量ax,sec_ax表示图片中的图表
#subplot()函数的参数分别为图片中图表的行数与列数,没有实参默认为 1,1
fig,(ax,sec_ax) = plt.subplots(1,2)

#对于第一个图
x_values = range(1,6)
y_values = [x**3 for x in x_values]

#使用plot()方法,其中参数linewidth为折线的宽度
ax.plot(x_values,y_values,linewidth = 2)

#修改图表与每条轴标题,参数fontsize为标题字号
ax.set_title("立方",fontsize = 15)
ax.set_xlabel("值",fontsize = 10)
ax.set_ylabel("值的立方",fontsize = 10)

#设置刻度
ax.tick_params(labelsize = 14)

#对于第二个图
x = range(1,5001)
y = [x**3 for x in x]

#使用scatter()方法绘制散点图
#设置颜色映射
sec_ax.scatter(x,y,c=y,cmap = plt.cm.Blues,s=2)

plt.show()

补充:

内置样式:matplotlib提供了很多内置样式,可在终端通过命令plt.style.available查看

若要使用这些样式,可在生成图表的代码前加入以下代码行

plt.style.use("seaborn")

若想让程序自动把图表保存在文件中,可将plt.show()替换为plt.savefig()

plt.savefig('squares_plot.png',bbox_inches = 'tight')

第一个实参指定保存的图表文件名,默认保存至程序所在目录,第二个实参‘tight’指定将图表多余的空白部分裁剪掉。

随机漫步

#random_walk.py
from random import choice

class RandomWalk:
	"""一个生成随机漫步数据的类"""
	def  __init__(self, num_points = 500):
		"""初始化随机漫步的属性"""
		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_distance = choice([0,1,2,3,4])
			x_step = x_distance * x_direction

			y_direction = choice([-1,1])
			y_distance = choice([0,1,2,3,4])
			y_step = y_distance * y_direction

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

			x = self.x_values[-1] + x_step
			y = self.y_values[-1] + y_step

			self.x_values.append(x)
			self.y_values.append(y)
#rw_visual.py
import matplotlib.pyplot as plt
from random_walk import RandomWalk

while True:

	rw = RandomWalk(5000)
	rw.fill_walk()

	# figsize参数设置生成图形的大小,dpi参数设置分辨率
	fig, ax = plt.subplots(figsize=(15, 9), dpi=128)
	point_numbers = range(rw.num_points)

	ax.scatter(rw.x_values,rw.y_values,c = point_numbers,cmap = plt.cm.Blues,s = 10)

	#隐藏坐标轴
	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

条形图

#die.py
from random import randint

class Die:
    """表示一个骰子的类"""

    def __init__(self,num_size = 6):
        self.num_size = num_size

    def roll(self):
        """返回一个随机值"""
        return randint(1,self.num_size)
#dice_visual.py
from die import Die
from plotly.graph_objs import Bar,Layout
from plotly import offline

die_1 = Die()
die_2 = Die(10)

results = []
for roll_num in range(50000):
    result = die_1.roll() + die_2.roll()
    results.append(result)
max_result = die_1.num_size + die_2.num_size

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

x_values =list(range(2,max_result+1))
#Bar()类表示用于绘制条形图的数据集,需要一个存储x值的列表和一个存储y值的列表
data = [Bar(x = x_values,y = frequencies)]

#设置坐标轴配置字典,参数dtick指定x轴显示的刻度间距
x_axis_config = {'title':'结果','dtick':1}
y_axis_config = {"title":"结果的次数"}

#类Layout()返回一个指定图表布局和配置的对象
#这里设置图表名称并传入了x轴和y轴的配置字典
my_layout = Layout(title = "掷一个D6和一个D10 50000次的结果",xaxis = x_axis_config,yaxis = y_axis_config)

#调用函数offline.plot(),该函数需要一个包含数据和布局对象的字典,
#还接受一个文件名,指定将图表保存到哪里
offline.plot({"data":data,"layout":my_layout},filename='d6_d10.html')