Python 数据可视化

1. NumPy 库

NumPy 是 Numerical Python(数值Python)的简称,是 Python 科学计算的基础包,它为 Python 提供了高性能数组与矩阵运算处理能力

1.1 数组运算

数学上将一维数组称为向量,将二维数组称为矩阵

一维数组

import numpy as np

x = np.array([1, 2, 3])
y = np.array([2, 3, 4])
# 对应元素的加法(元素个数要相同)
print(f"x + y: {x + y}")

# type(x): <class 'numpy.ndarray'>

二维码数组(矩阵)

import numpy as np

array = np.array([[1, 2], [3, 4]])
print(array)
print(f'array.shape: {array.shape}')
print(f"array[0]: {array[0]}, array[1][0]: {array[1][0]}")

打印结果:

[[1 2]
 [3 4]]
array.shape: (2, 2)
array[0]: [1 2], array[1][0]: 3

广播机制:
NumPy 中,形状不同的数组之间也可以进行运算, 比如:二维数组 * 一维数组

import numpy as np

A = np.array([[1, 2], [3, 4]])
B = np.array([10, 20])
print(f"A * B: {A * B}")

# 转为一维数组
A1 = A.flatten()
print(f"A.flatten(): {A1}")

1.2 随机数

rand(*dn): 生成一组在半开区间 [0.0, 1.0) 内的浮点数数组

import numpy as np

# 创建一个3x2的随机数矩阵
data = np.random.rand(3, 2)
data = np.random.random((3, 2))
# 创建一个 2x4 的矩阵,元素值为1到6之间的随机整数
randint = np.random.randint(1, 7, size=(2, 4))

1.3 linspace() 函数

# 创建数值序列
# # 在 0~10 之间生成 100 个等间隔点
data = np.linspace(0, 10, 100)

linspace() 用于生成线性等分的数组,即创建一系列均匀分布的数值,这些数值在指定的区间内按照指定的数量进行等分

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0):
start:区间的起始值
stop:区间的终止值(不包括此值,除非 endpoint=True)
num:生成的数组中元素的数量,默认为 50
endpoint:布尔值,表示是否包含 stop,默认为 True
retstep:布尔值,如果为 True,则返回步长 delta 和生成的数组
dtype:输出数组的数据类型。如果未指定,则根据 start 和 stop 自动选择
axis:新轴的位置。仅当 num 于 1 时有效,默认为 0

函数参数类型:

# function_base.pyi
@overload
def linspace(
    start: _ArrayLikeFloat_co,
    stop: _ArrayLikeFloat_co,
    num: SupportsIndex = ...,
    endpoint: bool = ...,
    retstep: L[False] = ...,
    dtype: None = ...,
    axis: SupportsIndex = ...,
) -> NDArray[floating[Any]]: ...
_ArrayLikeFloat_co = _DualArrayLike[
    "dtype[Union[bool_, integer[Any], floating[Any]]]",
    Union[bool, int, float],
]

dtype[] 用于描述 NumPy 数组的数据类型
integer[Any] 表示整数泛型,integer 表示整数类型,Any 是一个占位符,表示任何具体的整数类型(如 int8, int16, int32, int64 等)
bool_ 是 NumPy 中的布尔数据类型,通过 numpy.bool_() 访问,bool 是 Python 内置类型

2. pands 库

Pandas 中的预置数据结构:

  • Series:1D数组,它与Num Py中的一维数组(array)类似
  • Time Series:以时间为索引的Series
  • Data Frame:2D的表格型数据结构,Series的容器
  • Panel:3D的数组,Data Frame的容器

2.1 DataFrame

DataFrame 是一个二维表格型数据结构,以表格形式存储和操作数据

import pandas as pd

data = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data)

# 添加新列
df['new_col'] = df['col1'] + df['col2']

# 删除列
df.drop('new_col', axis=1, inplace=True)
# 读取csv 文件
df = pd.read_csv('../examples/tips.csv')
# head() 默认显示前 5 行
df.head()

3. Matplotlib 库

matplotlib 主要用于绘制二维图表,也可以通过 mpl_toolkits.mplot3d 块来绘制三维图表(使用 Axes3D 对象)

3.1 Figure 对象 和 坐标系 Axes

Figure 对象是绘制的所有内容的顶层容器,包含一个或多个 Axes(坐标系)、标题、图例等

创建 Figure 对象:

fig = plt.figure()
or
fig, ax = plt.subplots()

Axes 是实际进行绘图的地方,每个 Axes 都是一个独立的坐标系,具有自己的x轴、y轴

 # 创建一个2x2的子图网格
fig, axes = plt.subplots(2, 2)

3.2 创建图表(pyplot)

  • 图表类型
    • plot(): 折线图
    • scatter(): 散点图
    • bar(): 条形图
    • hist(): 直方图
    • pie(): 饼图
    • subplots(): 子图
  • 样式
    • title():设置图表标题。
    • xlabel() 和 ylabel():设置 x 轴和 y 轴的标签
    • legend():添加图例
    • show():显示图表
    • savefig():保存图表到文件

折线图

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 11]

# 创建折线图
plt.plot(x, y)

# 添加标题和标签
plt.title('Simple Line Plot')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')

# 显示图形
plt.show()

子图

import numpy as np
import matplotlib.pyplot as plt

data = np.linspace(0, 10, 100)
sin_data = np.sin(data)
cos_data = np.cos(data)

# 绘制折线图(当数据足够多时,折线图就变为了正弦图)
fig, (ax1, ax2) = plt.subplots(1, 2)

# 在 Axes 对象上绘制数据
ax1.plot(data, sin_data)
ax2.plot(data, cos_data)

# 设置 Figure 的整体标题
fig.suptitle('Multiple Subplots', fontsize=16)

# 自动调整子图间距
plt.tight_layout()

# 打开 Matplotlib 查看器并显示绘制的图表
plt.show()
import numpy as np
import matplotlib.pyplot as plt

data = np.linspace(0, 10, 50)
sin_data = np.sin(data)
cos_data = np.cos(data)

fig, axs = plt.subplots(2, 2)

axs[0, 0].plot(data, sin_data)
axs[0, 0].set_title('Sine Wave')

axs[1, 0].plot(data, cos_data)
axs[1, 0].set_title('Cosine Wave')

fig.suptitle('Multiple Subplots', fontsize=14)

plt.tight_layout()
plt.show()
import matplotlib.pyplot as plt
from random import randint

linear = list(range(1, 21))
wiggly = list(num + randint(-1, 1) for num in linear)

fig, plots = plt.subplots(nrows=1, ncols=3)
ticks = list(range(0, 21, 5))
for plot in plots:
    # 设置坐标轴的刻度
    plot.set_xticks(ticks)
    plot.set_yticks(ticks)

plots[0].scatter(linear, wiggly)
plots[1].plot(linear, wiggly)
# 'o-':设置线条格式,'o'表示在每个数据点处放置一个圆圈标记,'-'表示用实线连接这些点
plots[2].plot(linear, wiggly, 'o-')
plt.show()

3.3 subplots() 函数

subplots() 函数参数如下:

def subplots(
    nrows: int = 1, ncols: int = 1, *,
    sharex: bool | Literal["none", "all", "row", "col"] = False,
    sharey: bool | Literal["none", "all", "row", "col"] = False,
    squeeze: bool = True,
    width_ratios: Sequence[float] | None = None,
    height_ratios: Sequence[float] | None = None,
    subplot_kw: dict[str, Any] | None = None,
    gridspec_kw: dict[str, Any] | None = None,
    **fig_kw
) -> tuple[Figure, Any]:
    ...

def subplot(*args, **kwargs) -> Axes:
    ...

nrows: 行数,默认为 1
ncols: 列数,默认为 1

3.4 Axes.plot() 函数

matplotlib 3.10.0 版本的 Axes.plot() 函数

ax.plot(self, *args, scalex=True, scaley=True, data=None, **kwargs)

参数说明:

  • *args: 可接受一个或多个x、y数据对。通常形式为 x, y, [fmt], fmt 是可选的格式字符串,用来指定线条的颜色、标记样式和线条样式
  • scalex, scaley: 控制是否自动调整x轴和y轴的缩放比例,默认是 True
  • data: 可选参数
  • **kwargs: 允许传递额外的关键字参数来进一步定制你的线条属性,比如颜色、宽度、透明度等

fmt 格式字符串由三部分组成:颜色、标记、线条样式,顺序任意

  • 颜色: 如 'b' 表示蓝色, 'r' 表示红色等
  • 标记: 如 'o' 圆圈,'s' 正方形等
  • 线条样式: 如 '-' 实线,'--' 虚线等
    可以任意顺序组合,比如 'ro-' 表示带圆圈标记的红色实线

4. Seaborn

Seaborn 是一个数据可视化库,以 Matplotlib 为基础构建

5. 交互式图表(Plotly)

绘制直方图
鼠标放上去会显示数据,图表可平移和缩放

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容