【python VS vba】(8) 在python使用matplotlib库来画图

发布时间:2023年12月17日

目录

1 matplotlib的基本用法

1.1 需要用到的模块,需要实现安装,且导入

1.1.1 导入 import matplotlib.pyplot

1.1.2 matplotlib 词源

1.2 figure? 画图容器/?画布

1.2.1 figure的官方解释

1.2.2 必须先获取至少1个figure:

1.2.3 多个figure存在时,figure的生效范围

1.2.4 因为可以一段代码里存在多个plt.figure(),因此可以设置多个画布

1.2.5? 画布语法

1.3? 设置函数图形

1.4 绘图? plt.plot()

1.4.1 plt.plot()的语法

1.4.2 测试 plt.plot 代码

1.5 显示图像

2 用matplotlib 画函数图形

2.1 在一个画布里画多个图形

(1张画布,1个坐标轴系,多个图形叠在一起)

2.2 在多个画布里,分别画1个图形

(多张画布,多个坐标轴系,分别包含1个图形)

2.3? 一个画布里作图多个子图,且按表格排列好

(多张画布,多个坐标轴系,分别包含1个图形,且按内部序号排列)

2.3.1 用plt.subplot()方式绘制多子图

3? 关于坐标轴的各种设置

3.1 坐标轴的描述

3.2 坐标轴范围设置

3.3 坐标轴的刻度设置

4 图像的其他设置

4.1 设置画布的图形标题

?编辑

4.2 图片的图例

4.2.1 用plt.legend() 可设置多个曲线的图例,且默认展示在一起。

4.2.2?plt.plot(lable="")也可以设置单个plot 曲线的label,和图例效果差不多

4.3 是否显示网格

5 边界spines 和 移动坐标轴

5.1 先获取坐标轴

5.2 图片的4边,都是spine

5.3 比如隐藏右边、上边的spine

5.4 移动两个spine到0,0 点,达到把坐标轴移动的目的

5.5 移动坐标轴的代码(可看出图形移动到坐标轴的中间了)

5.5.1 移动效果看下面的图

5.5.2 移动坐标轴前后对比的测试代码

5.6 一个警告,不是报错

5.6.1 警告出现的可能原因1

5.6.2 警告出现的可能原因2

6 比如? 散点图 sactter


1 matplotlib的基本用法

1.1 需要用到的模块,需要实现安装,且导入

1.1.1 导入 import matplotlib.pyplot

import numpy as np
import matplotlib.pyplot as plt?

  • 注意,虽然常用的画图模块是 matplotlib
  • 但是实际上大家常用的 plt 是指 matplotlib.pyplot 这个子模块
  • 错误写法?import matplotlib as plt 会造成报错?TypeError: 'module' object is not callable

1.1.2 matplotlib 词源

matplotlib 推测词源

  • mat:matrix? 矩阵,向量组,2维数组等,甚至于 张量tensor
  • plot:绘制
  • lib: library 库

1.2 figure? 画图容器/?画布

1.2.1 figure的官方解释

figure是一顶级的容器,包含了绘图所有的元素。我把这个理解为画布

  • 1.the Figure, which contains all the plot elements.
  • 2.The top level container for all the plot elements.

1.2.2 必须先获取至少1个figure:

  • 需要画图形和现实图形,首先必须需要获取figure才可以
  • fig=plt.figure()
  • 获取figure的方式是:fig = plt.figure()。

1.2.3 多个figure存在时,figure的生效范围

  • 同一段代码可能会存在多个 figure
  • 一个figure到下一个figure语句前之间的区域,属于该figure的作图管辖范围;
  • 而如果没有下一个figure时,则到plt.show()之间的区域,属于该figure的作图管辖范围。
  • 在一个figure的作图管辖范围的图像都会展示在同一个figure绘画弹框中。

1.2.4 因为可以一段代码里存在多个plt.figure(),因此可以设置多个画布

  • 如果需要图像在多个不同的figure弹框中展示,则需要获取多个figure才可以
  • 获取figure的方式是:fig = plt.figure()
  • 设置多个画布的时候以创建 plt.figure() 为分界

1.2.5? 画布语法

画布语法:figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

  • num:图像编号或名称,数字为编号 ,字符串为名称,编号,实测可省略 ,
  1. 但是图上看不到num,如果是plt.subplot() 可以看到figure的编号
  • figsize:指定figure的宽和高,单位为英寸;画布大小,实测可省略,有默认值
  • dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80。1英寸等于2.5cm,A4纸是 21*30cm的纸张?
  • facecolor:背景颜色
  • edgecolor:边框颜色 (看不出来)
  • frameon:是否显示边框 (如果不显示边框,则? facecolor的颜色也没有效果)

import numpy as np
import matplotlib.pyplot as plt

fig1=plt.figure("名字",figsize=None,dpi=None,facecolor="gray", edgecolor="white", frameon=True)

x=np.linspace(-5,5, 10)
y=x*2+1
y2=x**2

# 绘图
plt.plot(x, y)
plt.plot(x, y2)

# 显示图像
plt.show()

  • fig1=plt.figure("名字",figsize=None,dpi=None,facecolor="gray", edgecolor="white", frameon=Fales)
  • 如果设置 frameon=Fales,则facecolor的颜色也没有效果

1.3? 设置函数图形

设置函数的关键:

函数就是形如 y=f(x)的样式,但是函数的作图需要具体的数据。

  • 1 自变量:需要一组自变量的数,方便作图。如果只是纯粹的函数形式当然抽象的X就够了。
  • 2 因变量:y=f(x)? 函数的表达式即可,因为因变量可计算出来
  1. 自变量:x=np.linspace(-5,5, 10)
  2. 因变量:y=x*2+1

1.4 绘图? plt.plot()

1.4.1 plt.plot()的语法

  • plt.plot(x, y)
  • plt.plot(x对应自变量:一般对应X轴, y对应因变量:一般对应y轴)
  • plt.plot(x, y, linestyle, linewidth,color,marker, markersize, markeredgecolor, markerfactcolor, label, alpha)
  1. x:指定折线图的x轴数据;
  2. y:指定折线图的y轴数据;
  3. linestyle:指定折线的类型,可以是实线、虚线、点虚线、点点线等,默认实线;
  4. linewidth:指定折线的宽度
  5. marker:可以为折线图添加点,该参数是设置点的形状;
  6. markersize:设置点的大小;
  7. markeredgecolor:设置点的边框色:颜色 "b" , "blue" ,或RGB方式"#ff0000"
  8. markerfacecolor:设置点的填充色:颜色 "b" , "blue" ,或RGB方式"#ff0000"
  9. label:"字符串" ,为折线图添加标签,类似于图例的作用;

1.4.2 测试 plt.plot 代码

import numpy as np
import matplotlib.pyplot as plt

plt.plot(x,
         np.cos(x),
         color = 'r',            # 线条颜色
         linewidth = 2,          # 线条宽度 
         linestyle='-.',          # 线的类型:虚线:'--',点线:'-.',短虚线':',实线:'-'
         marker='*',             # 线上点的形状
         markersize = 5,        # 点的大小
         markeredgecolor = 'b',  # 点的边框颜色
         markerfacecolor ='green',   # 点的背景颜色,可能因为点太小没显示出来?
         label = 'cos',          # 图例
         alpha = 1 )             # 透明度:0-1之间 ,默认1
 
plt.legend(fontsize = 15)        # 显示图例
plt.show()

1.5 显示图像

  • # 显示图像
  • matplotlib作图,要显示图像,必须调用plt.show(), 否则不显示
  • plt.show()

2 用matplotlib 画函数图形

2.1 在一个画布里画多个图形

(1张画布,1个坐标轴系,多个图形叠在一起)

import numpy as np
import matplotlib.pyplot as plt

fig1=plt.figure(num=1)

x=np.linspace(-5,5, 10)
y=x*2+1
y2=x**2

# 绘图
plt.plot(x, y)
plt.plot(x, y2)

# 显示图像
plt.show()

2.2 在多个画布里,分别画1个图形

(多张画布,多个坐标轴系,分别包含1个图形)

import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(-5,5, 10)

fig1=plt.figure(num=1,figsize=(3,3))
y=x*2+1
# 绘图
plt.plot(x, y)

#新开一个画布
fig2=plt.figure(num=2,figsize=(5, 5))
y2=x**2
# 绘图
plt.plot(x, y2)

# 显示图像
plt.show()


?

2.3? 一个画布里作图多个子图,且按表格排列好

(多张画布,多个坐标轴系,分别包含1个图形,且按内部序号排列)

2.3.1 用plt.subplot()方式绘制多子图

  • plt.subplot()方式绘制多子图,只需要传入简单几个参数即可:
  • plt.subplot(rows, columns, current_subplot_index)
  • 形如plt.subplot(2, 2, 1),其中:
  1. rows表示最终子图的行数;
  2. columns表示最终子图的列数;
  3. current_subplot_index表示当前子图的索引;
  4. 这几个参数是可以连写在一起的,同样可以被识别
  5. 例如:上面的plt.subplot(2, 2, 1),写成plt.subplot(221),两者是等价的。

import numpy as np
import matplotlib.pyplot as plt

# 子图1,散点图
plt.subplot(2, 2, 1)
plt.scatter(np.linspace(-2, 2, 5), np.random.randn(5))

# 子图2,折线图+网格
plt.subplot(2, 2, 2)
plt.plot(np.linspace(-2, 2, 5), np.random.randn(5))
plt.grid(True)

# 子图3,柱状图
plt.subplot(2, 2, 3)
x = np.linspace(0, 5, 5)
plt.bar(x, np.random.random(5))
plt.xticks(np.arange(0, 6))

# 子图4,饼图
plt.subplot(2, 2, 4)
plt.pie(np.random.random(5), labels=list("ABCDE"))

plt.show()

3? 关于坐标轴的各种设置

  • 坐标轴描述
  • 坐标轴范围设置
  • 坐标轴刻度
  • 挪动坐标轴

3.1 坐标轴的描述

  • plt.xlabel("X axis")
  • plt.ylabel("Y axis")

3.2 坐标轴范围设置

  • plt.xlim((-10,10))
  • plt.ylim((-10,10))

3.3 坐标轴的刻度设置

  • # 设置坐标轴刻度
  • plt.xticks([-4, -2, 0, 2, 4])
  • plt.yticks(np.linspace(-10, 10, 10))

  • # 这样可以清除刻度
  • plt.xticks()
  • plt.yticks()

import numpy as np
import matplotlib.pyplot as plt

fig1=plt.figure(num=1)

x=np.linspace(-5,5, 10)
y=x*2+1
y2=x**2

# 设置坐标轴描述
plt.xlabel("X axis")
plt.ylabel("Y axis")

# 设置坐标轴范围
plt.xlim((-10,10))
plt.ylim((-10,10))

# 设置坐标轴刻度
plt.xticks([-4, -2, 0, 2, 4])
plt.yticks(np.linspace(-10, 10, 10))
# 这样可以清除刻度 plt.xticks()
# 这样可以清除刻度 plt.yticks()

# 绘图
plt.plot(x, y)
plt.plot(x, y2)

# 显示图像
plt.show()


?

4 图像的其他设置

4.1 设置画布的图形标题

  • plt.title("here is title")
  • 一般在 figure的 正中间的正上方

4.2 图片的图例

4.2.1 用plt.legend() 可设置多个曲线的图例,且默认展示在一起。

  • # 显示图例
  • plt.legend()
  • plt.legend(labels=[xx_label, x_label])

4.2.2?plt.plot(lable="")也可以设置单个plot 曲线的label,和图例效果差不多

  • plt.plot(x, y, linestyle, linewidth,color,marker, markersize, markeredgecolor, markerfactcolor, label, alpha)
  • 见下图

4.3 是否显示网格

  • plt.grid(True)? ? ?# 显示网格
  • plt.grid(False)? ? # 隐藏网格


?

5 边界spines 和 移动坐标轴

5.1 先获取坐标轴

  • # 获取坐标轴,gca就是get current axes的意思
  • ax = plt.gca()

5.2 图片的4边,都是spine

  • 图片的4边,都是spine
  • 可以通过plt.gca().spines 分别操作这4个spine
  1. ax.spines["top"]
  2. ax.spines["bottom"]
  3. ax.spines["right"]?
  4. ax.spines["left"]

5.3 比如隐藏右边、上边的spine

  • # 隐藏右边、上边的spine
  • ax.spines["right"].set_color("none")
  • ax.spines["top"].set_color("none")

5.4 移动两个spine到0,0 点,达到把坐标轴移动的目的

  • # 移动两个spine到0,0,达到把坐标轴移动的目的
  • ax.spines["bottom"].set_position(("data", 0))
  • ax.spines["left"].set_position(("data", 0))

5.5 移动坐标轴的代码(可看出图形移动到坐标轴的中间了

5.5.1 移动效果看下面的图

  • 一般默认在第一象限
  • 图形移动到坐标轴的中间了

5.5.2 移动坐标轴前后对比的测试代码

import numpy as np
import matplotlib.pyplot as plt


#原始的
figure = plt.figure(num=99)
# x,y
x = np.linspace(-4, 4, 50)
y = x ** 2 - 4
xx_label = r"y = x ^ 2 - 4"
x_label = r"y = x"
plt.title("here is title")

# 绘图
plt.plot(x, y, color="#ff0000",label="xxx")
# 显示图例
plt.legend()
plt.plot(x, x)
# 显示网格
plt.grid(True)
# 显示图例
plt.legend(labels=[xx_label, x_label])





# 移动坐标轴的第2个图
figure = plt.figure(num=100)

# x,y
x = np.linspace(-4, 4, 50)
y = x ** 2 - 4

# 获取到坐标轴
ax = plt.gca()

# 隐藏右边、上边的spine
ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")

# 移动两个spine到0,0,达到把坐标轴移动的目的
ax.spines["bottom"].set_position(("data", 0))
ax.spines["left"].set_position(("data", 0))

xx_label = r"y = x ^ 2 - 4"
x_label = r"y = x"
plt.title("here is title")

# 绘图
plt.plot(x, y, color="#ff0000",label="xxx")

# 显示图例
plt.legend()

plt.plot(x, x)

# 显示网格
plt.grid(True)

# 显示图例
plt.legend(labels=[xx_label, x_label])

plt.show()

  • 图片上有容易让人误导的地方
  • 比如y=x 并不是45°直线,是因为格子grid不是正方形,是长方形压扁的缘故,请注意

5.6 一个警告,不是报错

?运行代码时可能会出现如下警告:No artists with labels found to put in legend. Note that artists whose label

5.6.1 警告出现的可能原因1

#plt.plot() 相关代码中缺乏label名称的说明

  • plt.plot(x, y, color="#ff0000")
  • plt.plot(x, y, color="#ff0000",label="xxx")? ?#没有这个就会警告 label="xxx"

5.6.2 警告出现的可能原因2

#legend相关代码中缺乏label名称的说明,需要给予图例对应的名字

  • # 显示图例
  • plt.legend()
  • plt.legend(labels=[xx_label, x_label])?# 调整后不报错并显示图例

6 比如? 散点图 sactter

import numpy as np
import matplotlib.pyplot as plt

# 散点图
# x, y
x = np.random.normal(0, 1, 20)
y = np.random.normal(0, 1, 20)

# 绘制散点图
plt.scatter(x, y, s=25, alpha=0.75)

plt.xlabel("X")
plt.ylabel("Y")

# 显示图像
plt.show()

7 直方图

import numpy as np
import matplotlib.pyplot as plt


# 直方图

# x, y
size = 12
x = np.arange(size)
y = np.random.uniform(0, 1, size) * 10

# 直方图
plt.bar(x, y, edgecolor="white")
plt.bar(x, -y, facecolor="#999999", edgecolor="white")

# 设置坐标
plt.xticks(x)
plt.yticks(np.linspace(-12, 12, 13))

# 显示数值
for (X, Y) in zip(x, y):
    plt.text(x=X, y=Y+0.2, s="%.1f" % Y, ha="center")
    print(X, Y)

# 显示图像
plt.show()

文章来源:https://blog.csdn.net/xuemanqianshan/article/details/134965107
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。