数据可视化是是通过借助图形化手段,将海量的数据以清晰、直观、有效的方式展示出来。通过数据可视化,能有效降低数据的读取门槛,方便人们从不同的维度观察数据,进而对数据进行深入浅出的分析,让人通过形象化方式解读数据信息。
下面,我将通过利用Python的Matplotlib实现柱形图,折线图,以及散点图的绘制,并将通过实例熟悉如何成功地绘制图表。
一、Matplotlib的基本用法
1.绘制柱形图。
实现代码:
import matplotlib.pyplot as plt
import random
x_values = [x for x in range(1, 10)]
y_values = [random.randint(1, 9) for i in range(9)]
plt.style.use('classic')
plt.bar(x_values, y_values, facecolor='b', hatch='')
plt.show()
代码解释:
这里,我们导入了random模块和matplotlib的pyplot模块并命为plt。接着,用列表推导式生成了x轴对应的数值,为1-9;同理,生成了9个1-9的y值。注意:x和y值的数量必须相同,否值将抛出ValueError异常。
plt.style.use('')表示使用内置样式。要看到能在你系统中使用的所有样式,可在终端回话中执行如下命令(读者可以尝试使用它们,找出你喜欢的):
import matplotlib.pyplot as plt
plt.style.available
- plt.bar表示生成柱形图。两个参数分别表示x轴的y轴对应的值。
- plt.show() 显示图形。
- plt.show()函数打开Matplotlib查看器并显示绘图。在查看器中,既可缩放和浏览绘图,还可单击磁盘图标将绘图保存起来
美化图形[plt.bar()内的参数]:
- 1.facecolor='b' 表示柱形图的填充颜色。默认为‘b’(蓝色),此外,还有‘r’(红色),‘g’(绿色)。
- 2.hatch=‘符号’,可设置柱形图的填充图案。如/,-,+,o等
- 3.edgecolor=‘g’ 设置边框颜色
- 4.linestyle=‘-’ 选择边框样式
- 5.linewidth=5 调整边框宽度
运行结果:
2.绘制折线图
实现代码:
import matplotlib.pyplot as plt
input_values = [x for x in range(1, 10)]
squares = [y**2 for y in range(1, 10)]
fig, ax = plt.subplots()
ax.plot(input_values, squares, linewidth=3)
# 设置图题并给坐标轴加上标签
ax.set_title("Square Number", fontsize=24)
ax.set_xlabel("Value", fontsize=14)
ax.set_ylabel("Square of Value", fontsize=14)
# 设置刻度标记的样式
ax.tick_params(labelsize=14)
代码解释:
- 变量fig表示生成的一系列绘图构成的整个图形。变量ax表示图形中的绘图,在大多数情况下,使用这个变量来定义的定制绘图。
- 接下来调用plot()方法,它将根据给定的数据以浅显易懂的方式绘图。
- 参数linewidth决定了plot()绘制的线条的粗细。生成绘图后,可在现实前使用很多方法修改它。set_title()方法给绘图指定标题。在上述代码中,多次出现的参数fontsize用于指定图中各种文字的大小。
- set_xlable()方法和set_ylabel()方法让你能够给每条轴设置标题。tick_params()方法设置刻度标记的样式。
运行结果:
3.绘制散点图
使用scatter()绘制单个点
实现代码:
import matplotlib.pyplot as plt
plt.style.use('seaborn-v0_8')
fig, ax = plt.subplots()
ax.scatter(2, 4, s=200)
plt.show()
运行结果:
使用scatter()绘制一系列点
实现代码:
import matplotlib.pyplot as plt
x_values = range(1, 1001)
y_values = [x**2 for x in x_values]
plt.style.use('seaborn-v0_8')
fig, ax = plt.subplots()
ax.scatter(x_values, y_values, c=y_values, cmap=plt.cm.Blues, s=10)
# x_values既可为range类型,又可以为list类型,这点和前面是一样的
# cmap参数表示设置颜色映射
ax.set_title("Square Nmubers", fontsize=24)
ax.set_xlabel("Value", fontsize=14)
ax.set_ylabel("Square of Value", fontsize=14)
ax.tick_params(labelsize=14)
# 设置每个坐标轴的取值范围
ax.axis([0, 1100, 0, 1_100_000])
# 定制刻度标记 style='plain'表示使用常规计数,默认为科学计数发
ax.ticklabel_format(style='plain')
plt.show()
代码解释:
ax.scatter()的第一个和第二个参数分别表示x轴和y轴的值,参数c类似于参数color,但用于将一系列值关联到颜色映射。这里讲参数c设置成了一个y坐标值列表,并使用参数cmap告诉pyplot使用哪个颜色映射。这些代码将y坐标较小的点显示为浅蓝色,将y坐标值较大的点显示为深蓝色。故效果图为由浅入深。当然,你也可以不使用颜色映射,此时,可作如下修改:
ax.scatter(x_values, y_values, color=(0,0.8,0), s=10)
此时传递参数color,并将其设置为一个元组,其中包含三个0~1的浮点数,分别表示红色,绿色和蓝色分量。
运行结果:
二、Matplotlib的进阶用法
看到这里,你已经学完了Matplotlib.pyplot的基础用法,现在,尝试解决一些较为复杂的问题.
1.分子运动:模拟花粉在水滴表面的运动路径
代码如下:
import matplotlib.pyplot as plt
import random
class RandomWalk:
def __init__(self, num_points=5000):
self.num_points = num_points
self.x_values = [0]
self.y_values = [0]
def fill_walk(self):
while len(self.x_values) < self.num_points:
x_step = self.get_step()
y_step = self.get_step()
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)
def get_step(self):
direction = random.choice([1, -1])
# 设置游走方向
distance = random.randint(1, 5)
# 设置单次游走的长度
step = direction * distance
return step
# 创建循环,模拟多次游走
while True:
rw = RandomWalk(num_points=500)
rw.fill_walk()
plt.style.use('seaborn-v0_8')
fig, ax = plt.subplots(figsize=(10, 6))
# figsize用于设置窗口尺寸
point_numbers = range(rw.num_points)
ax.set_title("Simulated pollen movement", fontsize=24)
ax.plot(rw.x_values, rw.y_values, linewidth=1.5)
# 设置第一个点和最后一个的样式,以突出显示
ax.scatter(0, 0, c='green', edgecolor='none', s=20)
ax.scatter(rw.x_values[-1], rw.y_values[-1], c='red', edgecolor='none', s=20)
ax.set_aspect('equal')
# 指定两条轴上的刻度间距必须相等
plt.show()
keep_running = input("Make another walk? (y/n)")
if keep_running == 'n':
break
print("The programme over.")
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/a1a028303a1e43c79cf68214fe2a24ee.png)
2.概率游戏:模拟掷骰子
投掷一个6点投资
代码如下:
import random
import plotly.express as px
class Die:
def __init__(self, num_sides=6):
self.num_sides = num_sides
def roll(self):
once = random.randint(1, self.num_sides)
return once
die = Die()
results = []
for iNumber in range(1000):
result = die.roll()
results.append(result)
frequencies = []
poss_results = range(1, die.num_sides+1)
# 掷几次骰子并将结果存储在一个列表中
for value in poss_results:
frequency = results.count(value)
frequencies.append(frequency)
title = "The result of rolling D6 1000 times"
label = {'x': 'Results', 'y': 'Frequency of Results'}
fig = px.bar(x=poss_results, y=frequencies, title=title, labels=label)
fig.show()
运行结果:
可以看到,频率几乎一样,投掷次数越多,概率越准。
要实现这一结果,需要在运行前安装Plotly和pandas这两个库
可以在终端使用如下命令,实现安装:
pip install plotly
pip install -i https://pypi.tuna.tinghua.edu.cn/simple pandas
投掷两个六点骰子
import random
import plotly.express as px
class Die:
def __init__(self, num_sides=6):
self.num_sides = num_sides
def roll(self):
once = random.randint(1, self.num_sides)
return once
die1 = Die()
die2 = Die()
results = []
for iNumber in range(1000):
result = die1.roll() + die2.roll()
results.append(result)
frequencies = []
max_result = die1.num_sides + die2.num_sides
poss_results = range(2, max_result+1)
for value in poss_results:
frequency = results.count(value)
frequencies.append(frequency)
title = "The result of rolling Two D6 1000 times"
label = {'x': 'Results', 'y': 'Frequency of Results'}
fig = px.bar(x=poss_results, y=frequencies, title=title, labels=label)
fig.update_layout(xaxis_dtick=1)
# path = "DataSet"
# fig.write_html(path+'/RollTwoDiesResult.html')
# 用于保存html文件到path目录下
fig.show()
如果要将绘图保存到文件中,而不是在Matplotlib查看器中显示它,可讲plt.show()替换为plt.savefig():
plt.savefig('square_plot.png', bbox_inches='tight')
第一个是惨指定要以什么文件名保存绘图,这个文件将被存储到文件名所在的目录中。第二个是惨指定将绘图多余的空白区域剪掉。如果要保留绘图周围多余的空白区域,省略即可。你还可以在调用savefig时使用Path对象,将输出文件存储到系统上的任何地方。
看到这里,不点个赞再走吗🤪