Matplotlib.day16
Matplotlib 库:是一款用于数据可视化的 Python 软件包,支持跨平台运行,它能够根据 NumPy ndarray 数组来绘制 2D 图像,它使用简单、代码清晰易懂
-
Figure:指整个图形,您可以把它理解成一张画布,它包括了所有的元素,比如标题、轴线等
-
Axes:绘制 2D 图像的实际区域,也称为轴域区,或者绘图区
-
Axis:指坐标系中的垂直轴与水平轴,包含轴的长度大小(图中轴长为 7)、轴标签(指 x 轴,y轴)和刻度标签
-
Artist:您在画布上看到的所有元素都属于 Artist 对象,比如文本对象(title、xlabel、ylabel)、Line2D 对象(用于绘制2D图像)等
-
Matplotlib 功能扩展包:许多第三方工具包都对 Matplotlib 进行了功能扩展,其中有些安装包需要单独安装,也有一些允许与 Matplotlib 一起安装。常见的工具包如下:
-
Basemap:这是一个地图绘制工具包,其中包含多个地图投影,海岸线和国界线
-
Cartopy:这是一个映射库,包含面向对象的映射投影定义,以及任意点、线、面的图像转换能力
-
Excel tools: 这是 Matplotlib 为了实现与 Microsoft Excel 交换数据而提供的工具
-
Mplot3d:它用于 3D 绘图
-
Natgrid:这是 Natgrid 库的接口,用于对间隔数据进行不规则的网格化处理
-
2.安装
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple/
3.应用场景
数据可视化主要有以下应用场景:
-
企业领域:利用直观多样的图表展示数据,从而为企业决策提供支持
-
股票走势预测:通过对股票涨跌数据的分析,给股民提供更合理化的建议
-
商超产品销售:对客户群体和所购买产品进行数据分析,促使商超制定更好的销售策略
-
预测销量:对产品销量的影响因素进行分析,可以预测出产品的销量走势
4.常用API
4.1 绘图类型
函数名称 | 描述 |
---|---|
Bar | 绘制条形图 |
Barh | 绘制水平条形图 |
Boxplot | 绘制箱型图 |
Hist | 绘制直方图 |
his2d | 绘制2D直方图 |
Pie | 绘制饼状图 |
Plot | 在坐标轴上画线或者标记 |
Polar | 绘制极坐标图 |
Scatter | 绘制x与y的散点图 |
Stackplot | 绘制堆叠图 |
Stem | 用来绘制二维离散数据绘制(又称为火柴图) |
Step | 绘制阶梯图 |
Quiver | 绘制一个二维按箭头 |
4.2 Image 函数
函数名称 | 描述 |
---|---|
Imread | 从文件中读取图像的数据并形成数组 |
Imsave | 将数组另存为图像文件 |
Imshow | 在数轴区域内显示图像 |
4.3 Axis 函数
函数名称 | 描述 |
---|---|
Axes | 在画布(Figure)中添加轴 |
Text | 向轴添加文本 |
Title | 设置当前轴的标题 |
Xlabel | 设置x轴标签 |
Xlim | 获取或者设置x轴区间大小 |
Xscale | 设置x轴缩放比例 |
Xticks | 获取或设置x轴刻标和相应标签 |
Ylabel | 设置y轴的标签 |
Ylim | 获取或设置y轴的区间大小 |
Yscale | 设置y轴的缩放比例 |
Yticks | 获取或设置y轴的刻标和相应标签 |
4.4 Figure 函数
函数名称 | 描述 |
---|---|
Figtext | 在画布上添加文本 |
Figure | 创建一个新画布 |
Show | 显示数字 |
Savefig | 保存当前画布 |
Close | 关闭画布窗口 |
5.pylab 模块
PyLab 是一个面向 Matplotlib 的绘图库接口,其语法和 MATLAB 十分相近。
pylab 是 matplotlib 中的一个模块,它将 matplotlib.pyplot 和 numpy 的功能组合在一起,使得你可以直接使用 numpy 的函数和 matplotlib.pyplot 的绘图功能,而不需要显式地导入 numpy 和 matplotlib.pyplot。
优点
-
方便快捷:pylab 的设计初衷是为了方便快速绘图和数值计算,使得你可以直接使用 numpy 的函数和 matplotlib.pyplot 的绘图功能,而不需要显式地导入 numpy 和 matplotlib.pyplot。
-
简化代码:使用 pylab 可以减少导入语句的数量,使代码更简洁。
缺点
-
命名空间污染:pylab 将 numpy 和 matplotlib.pyplot 的功能组合在一起,可能会导致命名空间污染,使得代码的可读性和可维护性降低。
-
不适合大型项目:对于大型项目或需要精细控制的项目,pylab 可能不够灵活。
pyplot 是 matplotlib 中的一个模块,提供了类似于 MATLAB 的绘图接口。它是一个更底层的接口,提供了更多的控制和灵活性。
使用 pyplot 需要显式地导入 numpy 和 matplotlib.pyplot,代码量相对较多。例如:
import matplotlib.pyplot as plt import numpy as np
6.常用函数
6.1 plot 函数
pylab.plot 是一个用于绘制二维图形的函数。它可以根据提供的 x 和 y 数据点绘制线条和/或标记。
# 导入 pylab 库
import pylab
# 创建数据,使用 linspace 函数
# pylab.linspace 函数生成一个等差数列。这个函数返回一个数组,数组中的数值在指定的区间内均匀分布。
x = pylab.linspace(-6, 6, 40)
# 基于 x 构建 y 的数据
y = x**2
# 绘制图形
pylab.plot(x,y,'r:')
# 展示图形
pylab.show()
6.2 figure 函数
figure() 函数来实例化 figure 对象,即绘制图形的对象,可以通过这个对象,来设置图形的样式等
参数:
-
figsize:指定画布的大小,(宽度,高度),单位为英寸
-
dpi:指定绘图对象的分辨率,即每英寸多少个像素,默认值为80
-
facecolor:背景颜色
-
dgecolor:边框颜色
-
frameon:是否显示边框
6.2.1 figure.add_axes()
Matplotlib 定义了一个 axes 类(轴域类),该类的对象被称为 axes 对象(即轴域对象),它指定了一个有数值范围限制的绘图区域。在一个给定的画布(figure)中可以包含多个 axes 对象,但是同一个 axes 对象只能在一个画布中使用。
参数:
是一个包含四个元素的列表或元组,格式为 [left, bottom, width, height],其中:
left 和 bottom 是轴域左下角的坐标,范围从 0 到 1。
width 和 height 是轴域的宽度和高度,范围从 0 到 1。
案例:
# 创建一个新的图形
fig = pl.figure()
# 添加第一个轴域
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
x = pl.linspace(0, 10, 100)
y = pl.sin(x)
ax.plot(x, y)
# 显示图形
pl.show()
6.2.2 axes.legend()
legend 函数用于添加图例,以便识别图中的不同数据系列。图例会自动显示每条线或数据集的标签。
参数:
-
labels 是一个字符串序列,用来指定标签的名称
-
loc 是指定图例位置的参数,其参数值可以用字符串或整数来表示
-
handles 参数,它也是一个序列,它包含了所有线型的实例
案例:
x = pl.linspace(0, 10, 100)
y1 = pl.sin(x)
y2 = pl.cos(x)
# 创建图形和轴域
fig, ax = pl.subplots()
# 绘制数据
line1 = ax.plot(x, y1)
line2 = ax.plot(x, y2)
# 添加图例,手动指定标签
ax.legend(handles=[line1, line2], labels=['Sine Function', 'Cosine Function'],loc='center')
# 显示图形
pl.show()
也可以将label定义在plot方法中,调用legend方法时不用再定义labels,会自动添加label
x = pl.linspace(0, 10, 100)
y1 = pl.sin(x)
y2 = pl.cos(x)
# 创建图形和轴域
fig, ax = pl.subplots()
# 绘制数据
line1, = ax.plot(x, y1, label='Sine Function')
line2, = ax.plot(x, y2, label='Cosine Function')
# 添加图例,手动指定标签
ax.legend(handles=[line1, line2], loc='center')
# 显示图形
pl.show()
6.3 标题中文乱码
如果标题设置的是中文,会出现乱码
局部处理:
plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus']=False
全局处理:
首先,找到 matplotlibrc 文件的位置,可以使用以下代码:
import matplotlib print(matplotlib.matplotlib_fname())
然后,修改 matplotlibrc 文件,找到 font.family 和 font.sans-serif 项,设置为支持中文的字体,如 SimHei。
同时,设置 axes.unicode_minus 为 False 以正常显示负号。
修改完成后,重启pyCharm。如果不能解决,尝试运行以下代码来实现:
from matplotlib.font_manager import _rebuild
_rebuild()
\
6.4 subplot 函数
subplot 是一个较早的函数,用于创建并返回一个子图对象。它的使用比较简单,通常用于创建网格状的子图布局。subplot 的参数通常是一个三位数的整数,其中每个数字代表子图的行数、列数和子图的索引。
add_subplot 是一个更灵活的函数,它是 Figure类的一个方法,用于向图形容器中添加子图。推荐使用 add_subplot,因为它提供了更好的灵活性和控制。
语法:
import matplotlib.pyplot as plt
import numpy as np
# 创建数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)
# 创建图形,figsize=(宽度, 高度),单位是英寸,图形宽度为 12 英寸,高度为 4 英寸
fig = plt.figure(figsize=(12, 4))
# 第一个子图
ax1 = fig.add_subplot(1, 3, 1)
ax1.plot(x, y1, label='sin(x)')
ax1.set_title('Sine Wave')
ax1.set_xlabel('X-axis')
ax1.set_ylabel('Y-axis')
ax1.legend()
# 第二个子图
ax2 = fig.add_subplot(1, 3, 2)
ax2.plot(x, y2, label='cos(x)')
ax2.set_title('Cosine Wave')
ax2.set_xlabel('X-axis')
ax2.set_ylabel('Y-axis')
ax2.legend()
# 第三个子图
ax3 = fig.add_subplot(1, 3, 3)
ax3.plot(x, y3, label='tan(x)')
ax3.set_title('Tangent Wave')
ax3.set_xlabel('X-axis')
ax3.set_ylabel('Y-axis')
ax3.legend()
# 显示图形
plt.tight_layout()
plt.show()
Pandas
一、基础
1、概述
-
Pandas 是一个开源的第三方 Python 库,从 Numpy 和 Matplotlib 的基础上构建而来
-
Pandas 名字衍生自术语 "panel data"(面板数据)和 "Python data analysis"(Python 数据分析)
-
Pandas 已经成为 Python 数据分析的必备高级工具,它的目标是成为强大、灵活、可以支持任何编程语言的数据分析工具
-
Pandas 是 Python 语言的一个扩展程序库,用于数据分析
-
Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具
-
Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)
-
Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据
-
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征
-
Pandas 广泛应用在学术、金融、统计学等各个数据分析领域
-
Pandas 的出现使得 Python 做数据分析的能力得到了大幅度提升,它主要实现了数据分析的五个重要环节:加载数据、整理数据、操作数据、构建数据模型、分析数据
2、安装
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple/
3、内置数据结构
Pandas 在 ndarray 数组(NumPy 中的数组)的基础上构建出了两种不同的数据结构,分别是 Series(一维数据结构)、DataFrame(二维数据结构):
-
Series 是带标签的一维数组,这里的标签可以理解为索引,但这个索引并不局限于整数,它也可以是字符类型,比如 a、b、c 等
-
DataFrame 是一种表格型数据结构,它既有行标签,又有列标签
数据结构 | 维度 | 说明 |
---|---|---|
Series | 1 | 该结构能够存储各种数据类型,比如字符数、整数、浮点数、Python 对象等,Series 用 name 和 index 属性来描述数据值。Series 是一维数据结构,因此其维数不可以改变 |
DataFrame | 2 | DataFrame 是一种二维表格型数据的结构,既有行索引,也有列索引。行索引是 index,列索引是 columns。 在创建该结构时,可以指定相应的索引值 |
4、Series
Pandas Series 类似表格中等一个列(column),类似于一维数组,可以保存任何数据类型 Series 由索引(index)和列组成,函数:
函数名 | 参数 |
---|---|
pandas.Series(data,index,dtype) | data:一组数据(ndarray 类型) index:数据索引标签,如果不指定,默认从 0 开始 dtype:数据类型,默认会自己判断 copy:表示对 data 进行拷贝,默认为 False |
4.1 创建 Series 对象的方式
4.1.1 创建 Series 空对象
import pandas as pd
series = pd.Series()
print(series)
4.1.2 ndarray 创建 Series 对象
import pandas as pd
import numpy as np
array_one = np.array(['小明', '小红', '小紫'])
series_one = pd.Series(data=array_one)
print('ndarray 创建 Series 对象:')
print(series_one)
# 输出:
0 小明
1 小红
2 小紫
dtype: object
4.2 访问 Series 数据
import pandas as pd
def five():
data = {"name": "陈蕾", "gender": "男"}
result = pd.Series(data=data)
print(result["name"])
print(result[1])
4.3 Series遍历
使用 items()
import pandas as pd
# 创建一个示例 Series
series = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
for index, value in series.items():
print(f"Index: {index}, Value: {value}")
#输出:
Index: a, Value: 1
Index: b, Value: 2
Index: c, Value: 3
4.4 Series 常用方法
4.4.1 isnull() 和 notnull()
isnull() 和 notnull() 用于检测 Series、DataFrame 中的缺失值。所谓缺失值,顾名思义就是值不存在、丢失、缺少
-
isnull():如果为值不存在或者缺失,则返回 True
-
notnull():如果值不存在或者缺失,则返回 False
import pandas as pd
'''
isnull() 和 nonull() 用于检测 Series 中的缺失值
isnull():如果为值不存在或者缺失,则返回 True
notnull():如果值不存在或者缺失,则返回 False
'''
def eight():
result = pd.Series(['a','b','c','d','e','f',None])
print("isnull()如果为值不存在或者缺失,则返回 True:")
print(result.isnull())
print("notnull()如果值不存在或者缺失,则返回 False:")
print(result.notnull())
#过滤掉缺失值
print(result[result.notnull()])
5、DataFrame
-
DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。其结构图示意图,如下所示:
-
DataFrame 的每一行或列数据都可以看成一个 Series 结构,只不过,DataFrame 为这些行中每个数据值增加了一个列或行标签
-
同 Series 一样,DataFrame 自带行标签索引,默认为“隐式索引”即从 0 开始依次递增,行标签与 DataFrame 中的数据项一一对应当然你也可以用“显式索引”的方式来设置行标签
-
DataFrame 构造方法如下:
函数名 | 参数 |
---|---|
pd.DataFrame( data, index, columns, dtype, copy) | data:一组数据(ndarray、series, map, lists, dict 等类型) index:索引值,或者可以称为行标签 columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) dtype:数据类型 copy:默认为 False,表示复制数据 data |
Dataframe和Series的关系:
在 Pandas 中,DataFrame
的每一行或每一列都是一个 Series
。
DataFrame
是一个二维表格,可以看作是由多个 Series
组成的。
如何区分行和列的 Series
:
列的 Series
:
-
标签是行索引。
-
值是该列的所有行数据。
行的Series:
-
标签是列名。
-
值是该行的所有列数据。
示例:
# 创建一个 DataFrame
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}
df = pd.DataFrame(data)
# 列的 Series
print(df['A']) # 标签是行索引,值是列 A 的所有行数据
# 行的 Series
print(df.loc[0]) # 标签是列名,值是第 0 行的所有列数据
# 输出:
0 1
1 2
2 3
Name: A, dtype: int64
A 1
B 4
C 7
Name: 0, dtype: int64