【学习笔记】Python大数据处理与分析——Matplotlib数据可视化

一、绘图步骤

1、导入第三方库

import matplotlib.pyplot as plt
import numpy as np

2、准备数据

x1 = np.linspace(1, 10, 5)
y1 = np.sin(x1)

3、开始绘图

plt.plot(x1, y1, linewidth=3)

4、完善图表

plt.title("plot figure")
plt.xlabel("value of x")
plt.ylabel("value of y")

5、展示结果

plt.show()

        绘制图形如下:

二、经典图形绘制

1、折线图

        plot()函数的原型为plt.plot(x, y, format_string, **kwargs),参数分别为:

x:x轴数据(列表或函数,可选)

y:y轴数据(列表或函数,必选)

format_string:控制线条的格式字符串(定义线条的基本属性,如颜色、点型和线型,可选)

**kwargs:一系列可选关键字参数(如label指定线条标签,linewidth指定线条宽度,color指定线条颜色等)

plt.plot(x1, y1, color='red', marker='o', linestyle='dashed', linewidth=1, markersize=4, label="figure")
plt.title("first graph", fontsize=20)                    # 图表标题
plt.xlabel("value of X", fontsize=12)                    # x轴标签
plt.ylabel("value of Y", fontsize=12)                    # y轴标签
plt.tick_params(axis='both', labelsize=10)               # 刻度样式
plt.grid(ls=":", c="b")                                  # 网格线
plt.text(4, 0.1, "y=sin(x)", weight="bold", color="b")   # 注释文本
plt.legend(loc="lower left")                             # 图例
plt.show()

        绘制图形如下:

2、柱状图

        bar()函数的原型为matplotlib.pyplot.bar(x, height, width=0.8, bottom=0, align='center', data=None, **kwargs),参数分别为:

x:标量序列,标示在x轴上的定性数据类别,即每个柱状的x轴坐标

height:标量或标量序列,和x对应,确定每种定性数据类别的数量,即柱状的y轴高度

width:标量或数组形式序列,可选,决定单个柱状图的宽度,默认值为0.8

bottom:标量或数组等类似序列,设置y边界坐标轴起点,默认值为0

align:可选的两个值为{‘center’, ‘edge’},其默认值为center,使基准在x位置居中。

**kwargs:传递一系列的关键字参数,如color指定柱状图颜色(单一颜色为全部使用此颜色,而颜色列表会逐一染色),edgecolor指定柱状边缘的颜色;linewidth指定柱状的宽度,tick_label设置柱状图的刻度标签,默认为无标签,根据x的设置来显示,hatch设置条形的绘制风格,每种hatch字符代表填充的形状(/代表斜杆,*代表五角星,.代表点,o代表圆形......)

x2 = [1, 2, 3, 4, 5, 6]
y2 = [7, 5, 3, 9, 4, 6]

mpl.rcParams["font.sans-serif"] = "SimHei"    # 字体样式
mpl.rcParams["axes.unicode_minus"] = False    # 字符显示
mpl.rcParams["font.size"] = 12                # 字体大小
plt.bar(x2, y2, width=0.4, align="center", tick_label=["toy", "cup", "battery", "textbook", "computer", "phone"], color=['c', 'b', 'r'], hatch='/')
plt.xlabel("箱子类型")
plt.ylabel("箱子重量(kg)")
plt.title("货运箱重量统计", color="b")
plt.show()

        绘制图形如下:

3、直方图

        hist()函数的原型为plt.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, **kwargs),参数分别为:

x: 必需参数,用于绘制直方图的数据
bins: 可选参数,指定直方图的柱子数量或柱子的边界值。默认值为10
range: 可选参数,指定直方图的取值范围。默认值为数据的最小值和最大值
density: 可选参数,指定是否将直方图的高度归一化为概率密度。默认值为False
histtype: 可选参数,指定直方图的类型。可以是’bar’(默认值),‘barstacked’,‘step’,'stepfilled’等
color: 可选参数,指定直方图的颜色
label: 可选参数,指定直方图的标签,用于图例显示
align: 可选参数,指定柱子的对齐方式。可以是’left’,‘mid’(默认值),‘right’
orientation: 可选参数,指定直方图的方向。可以是’vertical’(默认值),‘horizontal’
rwidth: 可选参数,指定柱子的宽度,取值范围为[0, 1]。默认值为None,表示自适应宽度
**kwargs:传递其他关键字参数,用于进一步自定义直方图的样式和属性

x3 = [np.random.randint(0, 100, 40), np.random.randint(0, 100, 40)]
y3 = list(range(0, 101, 10))

mpl.rcParams["font.sans-serif"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False
mpl.rcParams["font.size"] = 12

plt.hist(x3, bins=y3, color=['c', 'b'], histtype="bar", rwidth=1, alpha=0.6, edgecolor="black", label=['一班', '二班'])
plt.xlabel("测试成绩")
plt.ylabel("学生人数")
plt.title("学生英语考试分数统计", color="r")
plt.legend()
plt.show()

         绘制图形如下:

4、散点图

        scatter()函数的原型为matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs),参数分别为:

x,y:输入点列的数组,长度都是size

s:点的直径数组,默认直径20,长度最大size

c:点的颜色,默认蓝色 'b',也可以是个 RGB 或 RGBA 二维行数组

marker:点的样式,默认小圆圈 'o'。

cmap:默认None,标量或者是一个colormap的名字,只有c是一个浮点数数组时才使用。如果没有申明就是 image.cmap

norm:默认None,数据亮度在0-1之间,只有c是一个浮点数的数组的时才使用

vmin,vmax:亮度设置,在norm参数存在时会忽略

alpha:透明度设置,0-1之间,默认None,即不透明

linewidths:标记点的长度

edgecolors:颜色或颜色序列,默认为 'face',可选值有 'face', 'none', None

plotnonfinite:布尔值,设置是否使用非限定的c(inf, -inf 或 nan) 绘制点

**kwargs:其他参数。

        以随机漫步过程为例:

from random import choice    # 补充

class RandomWalk:
    def __init__(self, point_num=50000):
        self.point_num = point_num
        self.xval = [0]
        self.yval = [0]

    def fill_walk(self):
        while len(self.xval) < self.point_num:
            # 计算x和y的漫步方向和步数
            x_direction = choice([1, -1])
            step_num = choice([0, 1, 2, 3, 4])
            xstep = x_direction * step_num
            y_direction = choice([1, -1])
            step_num = choice([0, 1, 2, 3, 4])
            ystep = y_direction * step_num
            # 如果原地踏步,则跳过此次循环
            if xstep == 0 and ystep == 0:
                continue
            # 计算下个点的坐标
            x_next = self.xval[-1] + xstep
            y_next = self.yval[-1] + ystep
            # 将该点坐标加入xval和yval两个列表
            self.xval.append(x_next)
            self.yval.append(y_next)


rw = RandomWalk()
rw.fill_walk()


fig, ax = plt.subplots()
point_numbers = list(range(rw.point_num))
# 按point_numbers列表指定的点序绘制渐变色散点
ax.scatter(rw.xval, rw.yval, c=point_numbers, edgecolors='none', s=2)
# 绘制起点和终点
ax.scatter(0, 0, c='green', edgecolors='none', s=2)
ax.scatter(rw.xval[-1], rw.yval[-1], c='red', edgecolors='none', s=2)
# 隐藏坐标轴
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
plt.show()

        绘制图形如下: 

5、等值(量)线图

(1)导入所需要的库

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np

(2)数据准备

n = 128
x4 = np.linspace(-4, 4, n)
y4 = np.linspace(-4, 4, n)

(3)填充等高线颜色

def f(x, y):
    z = (1 - y ** 6 + x ** 6) * np.exp(-x ** 2 - y ** 2)
    return z


# 生成mesh网格状数据,用f()函数计算网格面上每点对应高度值,结合网格上每点二维坐标绘制等高线
x5, y5 = np.meshgrid(x4, y4)
z = f(x5, y5)

# 填充等高线
plt.contourf(x5, y5, z)

        此时的绘制情况如下:

        为显示热力图,需修改plt.contourf():

csf = plt.contourf(x5, y5, z, cmap=mpl.cm.hot)

        修改后的绘制情况如下:

(4)绘制等高线

# 绘制等高线
cs = plt.contour(x4, y4, z, 10, colors='black')
# 添加等高线文字标签
plt.clabel(cs, inline=True, fontsize=12)
# 添加图例
plt.colorbar(csf)

(5)输出等高线图 

plt.show()

        绘制图形如下:

6、地理信息可视化

(1)平面世界地图

# 设置投影方式
map1 = Basemap(projection='cyl')
# 背景上蓝色
map1.drawmapboundary(fill_color='aqua')
# 陆地上土黄色,江河湖泊上蓝色
map1.fillcontinents(color='coral', lake_color='aqua')
# 绘制图像
map1.drawcoastlines()
plt.show()

        绘制图形如下:

(2)球状世界地图

# 设置投影方式
map2 = Basemap(projection="ortho", lat_0=30, lon_0=120)
# 背景上蓝色
map2.drawmapboundary(fill_color="aqua")
# 陆地上土黄色,江河湖泊上蓝色
map2.fillcontinents(color="coral", lake_color="aqua")
# 绘制图像
map2.drawcoastlines()
plt.show()

        绘制图形如下:

 

三、图表调整及美化

        大致分为添加图例和标题,调整刻度格式、标签设置、内容和格式设置,添加网格线,绘制参考线,添加图表注释,向统计图形添加表格,颜色参数使用和颜色映射表使用,细节处可自行查询函数说明,示例代码如下:

# 设置字体
mpl.rcParams["font.sans-serif"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False

# 数据准备
x6 = np.linspace(0.2, 3.0, 100)
y6 = np.sin(x6)
y6_ = np.random.randn(100)

# 绘图
plt.scatter(x6, y6_, c="green", label="散点图", edgecolors="none")
plt.plot(x6, y6, ls="--", c="red", lw=3, label="曲线图")
# 设置刻度范围
plt.xlim(0.0, 4.0)
plt.ylim(-4.0, 4.0)
# 设置坐标轴标签
plt.xlabel("X轴")
plt.ylabel("Y轴", rotation=360)
# 设置网格
plt.grid(True, ls=":", color="grey")
# 设置参考线
plt.axhline(y=0.0, c="r", ls="--", lw=2)
# 设置注释
plt.annotate("y=sin(x)", xy=(np.pi / 2, 1.0), xytext=(1.8, 2), color="r", fontsize=15, arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="r"))
plt.annotate("y,x轴", xy=(0.75, -4), xytext=(0.35, -2.7), color="b", fontsize=15, arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="b"))
plt.annotate("", xy=(0, -3.5), xytext=(0.3, -2.7), color="b", arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="b"))
plt.annotate("", xy=(3.5, 0.0), xytext=(3.4, -1.0), color="b", arrowprops=dict(arrowstyle="->", connectionstyle="arc3", color="b"))
plt.text(3.0, -1.3, "图表参考线", color="b", fontsize=15)
# 设置标题
plt.title("图标元素设置示例", color="m", fontsize=20)
# 设置图例
plt.legend(loc="upper right", fontsize=12)
# 显示图形
plt.show()

        绘制图形如下:

四、综合案例

import matplotlib.pyplot as plt
import matplotlib as mpl
from random import randint

mpl.rcParams["font.sans-serif"] = "Microsoft YaHei"
mpl.rcParams["axes.unicode_minus"] = False


# 骰子类
class Die:
    def __init__(self, num=6):
        self.num = num

    def roll_die(self):
        return randint(1, self.num)


die1 = Die()
die2 = Die()
results = []
count_nums = []
x7 = list(range(1, 13))

# 掷2000次,结果存入result列表
for roll_num in range(2000):
    result = die1.roll_die() + die2.roll_die()
    results.append(result)
# 统计每一面被掷到的次数
for value in range(1, die1.num + die2.num + 1):
    count_num = results.count(value)
    count_nums.append(count_num)

# 绘制图表
plt.bar(x7, count_nums, width=0.7, edgecolor="black", alpha=0.6, label="频数")
plt.xlabel("骰子点数和")
plt.ylabel("各点数之和出现的频数")
plt.title("两个骰子掷2000次", color="r")
plt.xticks(range(1, 13))
plt.grid(axis='y', ls=":", color="grey", alpha=0.5)
plt.legend()
plt.show()

        绘制图形如下:

 

 

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有为肥宅

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

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

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

打赏作者

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

抵扣说明:

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

余额充值