用Python的Matplotlib模块实现数据可视化详解

        数据可视化是是通过借助图形化手段,将海量的数据以清晰、直观、有效的方式展示出来。通过数据可视化,能有效降低数据的读取门槛,方便人们从不同的维度观察数据,进而对数据进行深入浅出的分析,让人通过形象化方式解读数据信息。

        下面,我将通过利用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.")

运行结果:


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对象,将输出文件存储到系统上的任何地方。

看到这里,不点个赞再走吗🤪

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝴蝶也姓胡 ye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值