【科学计算与可视化】3. Matplotlib 绘图基础

发布于:2024-06-27 ⋅ 阅读:(178) ⋅ 点赞:(0)

安装 pip install matplotlib
官方文档 https://matplotlib.org/stable/api/pyplot_summary.html

主要介绍一些图片绘制的简要使用,更加详细和进阶需要可参考 以上官方文档。

1 绘制基础

方法名 说明
title() 设置图表的名称
xlabel() 设置 x 轴名称
ylabel() 设置 y 轴名称
xticks(x, ticks, rotation) 设置 x 轴的刻度, rotation 为旋转角度
yticks() 设置 y 轴的刻度
plot() 绘制线性图表
show() 显示图表
legend() 显示图例
text(x, y, text) 显示每条数据的值,x, y 为值的位置
figure(name, figsize=(w, h), dpi=n) 设置图片大小,name 为图片名称,figsize 为图片宽高尺寸,dpi 为图片分辨率

1.1 基础方法

import matplotlib.pyplot as plt
plt.plot([0,2],[1,4]) # 将 (0,1) (2,4) 两点连成一条直线  
plt.show()  
  
# 绘制折线  
plt.plot([0,1,2,3],[0,1,4,9])  
plt.show()  
  
plt.plot([0,1,2,3],[0,1,4,9], linewidth=5)  # 设置线条宽度  
plt.title("y = x ^ 2")  # 设置图形的标题  
plt.xlabel("x") # 设置图形 x 轴标签  
plt.ylabel("y") # 设置图形 y 轴标签  
plt.show()  
  
# 绘制一元二次方程曲线  
x = range(-100, 100)  # x 的刻度越细  曲线越平滑  
y = [i**2 for i in x]  
plt.title("y = x ^ 2")  # 设置图形的标题  
plt.plot(x, y)  
plt.show()  
  
# 绘制正弦曲线和余弦曲线  
import numpy as np  
x = np.linspace(-2*np.pi, 2*np.pi, 100)  
y1 = np.sin(x)  
y2 = np.cos(x)  
plt.title("sin(x) and cos(x)")  
plt.xlabel("x")  
plt.ylabel("y")  
plt.plot(x, y1)  
plt.plot(x, y2)  
plt.legend(["sin(x)", "cos(x)"], loc="best")  
plt.show()

1.2 绘制子图

x = np.linspace(1, 10, 100)  
# 调整子图间距  
plt.subplots_adjust(wspace=0.4, hspace=0.6)  # 增加子图之间的宽度间距  
  
plt.subplot(2, 2, 1)  
plt.title("sin(x)")  
plt.xlabel("x")  
plt.ylabel("six(x)")  
plt.plot(x, np.sin(x))  
  
plt.subplot(2, 2, 2)  
plt.title("cos(x)")  
plt.xlabel("x")  
plt.ylabel("cos(x)")  
plt.plot(x, np.cos(x))  
  
plt.subplot(2, 2, 3)  
plt.title("tan(x)")  
plt.xlabel("x")  
plt.ylabel("tan(x)")  
plt.plot(x, np.tan(x))  
  
plt.subplot(2, 2, 4)  
plt.title("log(x)")  
plt.xlabel("x")  
plt.ylabel("log(x)")  
plt.plot(x, np.log(x))  
plt.show()

也可以获取子图的对象进行对应的设置

# 创建一些数据  
x = np.linspace(0, 10, 100)  
y1 = np.sin(x)  
y2 = np.cos(x)  
  
# 创建一个 figure 和两个子图  
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))  
  
# 绘制第一个子图  
ax1.plot(x, y1, color='blue')  
ax1.set_title('Sine Function')  
ax1.set_xlabel('X axis')  
ax1.set_ylabel('Y axis')  
  
# 绘制第二个子图  
ax2.plot(x, y2, color='red')  
ax2.set_title('Cosine Function')  
ax2.set_xlabel('X axis')  
ax2.set_ylabel('Y axis')  
  
# 调整子图间距  
plt.subplots_adjust(wspace=0.4)  # 增加子图之间的宽度间距  
  
# 显示图表  
plt.show()

在这里插入图片描述

2 绘制散点图

关于点样式的写法可参考 官网文档 https://matplotlib.org/stable/api/pyplot_summary.html

x = np.arange(6)  
plt.plot(x, x, "ro")  # 红色圆点  plt.plot(x, x ** 2, "g+")  # 绿色加号  
plt.show()  
plt.close()  # 关闭当前的 plt  重新开始绘图  
  
plt.scatter(x, x)  
plt.show()  
  
  
# 绘制 10种大小 100种颜色的散点图  
np.random.seed(42)  
x = np.random.rand(100)  
y = np.random.rand(100)  
colors = np.random.rand(100)  
size = np.tile(np.random.rand(10), 10) * 100   # 生成 10个大小  需要复制 10次  
np.random.shuffle(size) # 打乱大小  
plt.scatter(x, y, c=colors, s=size, alpha=0.5)

在这里插入图片描述

3 绘制柱状图

import numpy as np  
import matplotlib.pyplot as plt  
from matplotlib import font_manager  
my_font = font_manager.FontProperties(fname='./simhei.ttf')  
x= np.linspace(0, 20, 4)   # x 轴  柱的位置
x_labels=['2000 年','2001 年','2002 年','2003 年']    # x轴的标签
y=[1000,3000,4000,5000]  
plt.bar(x,y,width=3)  
plt.xticks(x,x_labels, fontproperties=my_font) # 修改 x 轴的 标签  
plt.xlabel('年份', fontproperties=my_font)  
plt.ylabel('销量', fontproperties=my_font)  
plt.title('根据年份销量对比图', fontproperties=my_font)  
plt.show()
real_names=['A 公司','B 公司','C 公司']  
real_num1=[2314,4521,5632]  
real_num2=[2211,1223,2222]  
real_num3=[1115,1111,3333]  
#生成 x 第 1 天 第 2 天 第 3 天  
x=np.arange(len(real_names))  
x_label=['第{}天'.format(i+1) for i in range(len(real_names))]  
#绘制柱状图  
#设置柱的宽度  
width=0.3  
plt.bar(x,real_num1,color='g',width=width,label=real_names[0])  
plt.bar([i+width for i in x],real_num2,color='b',width=width,label=real_names[1])  
plt.bar([i+2*width for i in x],real_num3,color='r',width=width,label=real_names[2])  
#修改 x 坐标  
plt.xticks([i+width for i in x],x_label, fontproperties=my_font)  
#添加图例  
plt.legend(loc="best", labels=real_names, prop=my_font)  
#添加标题  
plt.title('3 天的销售量', fontproperties=my_font)  
plt.show()

在这里插入图片描述

4 绘制饼状图

import matplotlib.pyplot as plt  
import numpy as np
male = 200  
female = 150  
male_percent = male / (male + female)  
female_percent = female / (male + female)  
labels = ['male', 'female']  
colors = ['lightblue', 'pink']  
  
paches, text, autotexts = plt.pie([male_percent, female_percent], labels=labels, colors=colors, autopct= '%0.1f%%')  
# 设置饼状图中的字体颜色与字体大小
for text in autotexts:  
    text.set_color('white')  
    text.set_fontsize(20)  
plt.title('Gender Distribution')  
plt.show()

pandas DataFrame 的某一列绘制饼状图

# Import  
import pandas as pd  
import matplotlib.pyplot as plt  
df_raw = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")  
plt.figure(figsize=(8, 8), dpi= 100)
# Prepare Data  
df = df_raw.groupby('class').size()  
  
# Make the plot with pandas  
df.plot(kind='pie', subplots=True, figsize=(8, 8))  
plt.title("Pie Chart of Vehicle Class - Bad")  
plt.ylabel("")  
plt.show()

在这里插入图片描述

5 绘制直方图

直方图和柱状图很类似。

直方图是用来观察分布状态的

柱状图是用来看每一个 X 坐标对应的 Y 值

直方图关注的是分布,并不关心具体的某个值。

import numpy as np  
import matplotlib.pyplot as plt  
x = np.random.randn(2000)  
# plt.hist(x)  
plt.hist(x, bins= 100) # 分成 100份  
plt.show()

同一个画布绘制三个直方图

import numpy as np  
import matplotlib.pyplot as plt  

plt.figure(figsize=(8,8), dpi=100)  # figsize用来设置图片大小, dpi 设置图像清晰度
x1 = np.random.normal(0, 0.8, 1000)  
x2 = np.random.normal(-1, 1, 1000)  
x3 = np.random.normal(2, 2, 1000)  
kwargs = dict(bins=100, alpha=0.5)  
  
plt.hist(x1, **kwargs)  
plt.hist(x2, **kwargs)  
plt.hist(x3, **kwargs)  
  
plt.show()

在这里插入图片描述

6 绘制等高线图

import matplotlib.pyplot as plt  
import numpy as np  
x = np.linspace(-5, 5, 100)  
y = np.linspace(-5, 5, 100)  
  
X, Y = np.meshgrid(x, y)  
Z = np.sqrt(X**2 + Y**2)  
plt.contourf(X, Y, Z)  
plt.contour(X, Y, Z)  
# 颜色越深表示值越小 中间的黑色表示 z = 0plt.show()

在这里插入图片描述

  1. 导入所需的库:matplotlib.pyplot和numpy。
  2. 使用numpy的linspace函数生成一个从-5到5的等间距数组,数组大小为100
  3. 使用numpy的meshgrid函数将x和y转换为网格
  4. 计算z=sqrt(x^2 + y^2),其中x和y是网格的坐标
  5. 使用matplotlib的contourf函数绘制等值线filled contour图。contourf函数会填充z值大于某个阈值的区域
  6. 使用matplotlib的contour函数绘制等值线contour图
  7. 最后,使用matplotlib的show函数显示图形。

7 绘制三维图

import numpy as np  
import matplotlib.pyplot as plt  
from mpl_toolkits.mplot3d import Axes3D  
  
# 创建 X、Y、Z 坐标  
X = np.linspace(-5, 5, 100)  
Y = np.linspace(-5, 5, 100)  
X, Y = np.meshgrid(X, Y)  
Z = np.sin(np.sqrt(X**2 + Y**2))  
  
# 创建3D图  
fig = plt.figure()  
ax = fig.add_subplot(111, projection='3d')  
  
# 绘制3D曲面  
ax.plot_surface(X, Y, Z, cmap='viridis')  
  
# 设置坐标轴标签  
ax.set_xlabel('X')  
ax.set_ylabel('Y')  
ax.set_zlabel('Z')  
  
# 显示图形  
plt.show()

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到