Python作图总结——plot,subplots

目录

1 前言

2 常用属性和属性变量介绍

3 plot

4 subplots

5 plot封装


1 前言

需要导入的模块和函数:
import matplotlib.pyplot as plt  #画图函数
from matplotlib import style  #图形风格设置

2 常用属性和属性变量介绍

属性:风格,点型maker,点的大小Markersize,线型linestyle,线宽Linewidth,颜色'color',字体大小fontsize,图例label

属性常用的变量:

  • 风格:'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'seaborn', 'Solarize_Light2', 'tableau-colorblind10', '_classic_test'
  • 点型:圆圈'O',加号'+',星号'*',点'.',叉号'X',方形's',菱形'd'
  • 线型:实线'-',虚线'--',点线':',点划线'-.'
  • 颜色:'r','g','b','c','m','y','k','w','none'-红、绿、蓝、青、洋红、黄、黑、白、默认

3 plot

场景一:已知一个y

import matplotlib.pyplot as plt
from matplotlib import style
#-----只是已知y
x=range(-5,10,1)
y=[i*i for i in x]
plt.figure(1)
style.use('classic')  # 加载'classic'风格
plt.plot(y,marker='o',markersize=6,color="blue", linewidth=2.0, linestyle="solid", label="y")
plt.title('y_test',fontsize=30)#设置图的标题
plt.legend(loc="best")#图例放到图中的最佳位置
plt.xlabel('Points',fontsize=14)  #设置横轴名称以及字体大小
plt.ylabel('Alp',fontsize=14)   #设置纵轴
plt.savefig('a_myplot.jpg', dpi=700) #保存图片,矢量图
plt.show() #显示图像

运行结果:​​​​​​​

 x默认从0开始,间隔为1. 

场景二:已知一个x一个y

import matplotlib.pyplot as plt
from matplotlib import style
#-----已知一个x一个y
x=range(-5,10,1)
y=[i*i for i in x]
plt.figure(2)
style.use('fast')  # 加载'fast'风格
plt.plot(x,y,marker='o',markersize=6,color="blue", linewidth=2.0, linestyle="solid", label="y_x")
plt.title('y_x_test',fontsize=30)#设置图的标题
plt.legend(loc="best")#图例放到图中的最佳位置
plt.xlabel('Points',fontsize=14)  #设置横轴名称以及字体大小
plt.ylabel('Alp',fontsize=14)   #设置纵轴
plt.savefig('a_myplot.jpg', dpi=700) #保存图片,矢量图
plt.show() #显示图像

运行结果:

 场景三:已知一个x多个y 

import matplotlib.pyplot as plt
from matplotlib import style
#-----已知一个x多个y
x=range(-5,10,1)
y1=x
y2=[i*i for i in x]
plt.figure(3)
style.use('ggplot')  # 加载'ggplot'风格
plt.plot(x,y1,marker='o',markersize=6,color="b", linewidth=2.0, linestyle="solid", label="y1_x")
plt.plot(x,y2,marker='o',markersize=6,color="r", linewidth=2.0, linestyle="solid", label="y2_x")
plt.title('ys_x_test',fontsize=30)#设置图的标题
plt.legend(loc="best")#图例放到图中的最佳位置
plt.xlabel('Points',fontsize=14)  #设置横轴名称以及字体大小
plt.ylabel('Alp',fontsize=14)   #设置纵轴
plt.savefig('a_myplot.jpg', dpi=700) #保存图片,矢量图
plt.show() #显示图像

运行结果如下:  

 在这里有个疑问,如果有100个y,那需要把那条plt.plot()的代码复制100条吗?不知道有没有更简洁的方法?

4 subplots

subplots实际上是在一幅图里面显示几张子图,弄清楚子图显示的位置即可。

import matplotlib.pyplot as plt
from matplotlib import style
#-----子图显示方法
x=range(-5,10,1)
y1=x
y2=[i*i for i in x]
plt.figure(4)
style.use('grayscale')  # 加载'grayscale'风格
fig,ax=plt.subplots(2,2) #设置子图的数量
ax[0][0].plot(x,y1,marker='o',markersize=6,color="b", linewidth=2.0, linestyle="solid", label="y1_x")
ax[0][0].set_title('y1_x_test',fontsize=15)#设置图的标题
ax[0][0].set_xlabel('Points',fontsize=10)  #设置横轴名称以及字体大小
ax[0][0].set_ylabel('Alp',fontsize=10)   #设置纵轴
ax[0][0].legend(loc="best")#图例放到图中的最佳位置

ax[1][0].plot(x,y2,marker='o',markersize=6,color="r", linewidth=2.0, linestyle="solid", label="y2_x")
ax[1][0].set_title('y2_x_test',fontsize=15)#设置图的标题
ax[1][0].set_xlabel('Points',fontsize=10)  #设置横轴名称以及字体大小
ax[1][0].set_ylabel('Alp',fontsize=10)   #设置纵轴
ax[1][0].legend(loc="best")#图例放到图中的最佳位置

plt.tight_layout()  # 当有多个子图时,可以使用该语句保证各子图标题不会重叠
plt.savefig('a_myplot.jpg', dpi=700) #保存图片,矢量图
plt.show() 显示图像

运行结果如下:

5 plot封装

在第三章学习的过程中,发现有如下问题:

① 图像中不能显示中文;

② 负号可能不正常显示;

③ 当因变量过多时,plot用起来很麻烦。

笔者总结了一个可以解决上述问题的子函数。子函数代码如下:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style

# 函数的功能,在一张图里显示一个x一个y或者1个x多个y
# count表示第几张图片
# x,y是自变量和因变量,y是按列的二维数组,每一列对应一个因变量
# my_title是图名,格式是字符串
# my_label是图例名,字符串
# my_xlabel,是横坐标名称,字符串
# my_ylabel,是纵坐标,字符串
def plot_x_ys(count, x, y, my_title, my_label, my_xlabel, my_ylabel, my_color,my_makerize,my_linewidth):
    if len(y.shape) == 1:
        y = y[:, np.newaxis]  # 如果是向量,列数的求解会报错,需要将向量转换成1列二维数组
    m = y.shape[0]  # 行数
    n = y.shape[1]  # 列数
    plt.figure(count)
    style.use('seaborn-bright')  ##加载'seaborn-bright'风格
    plt.rcParams['font.sans-serif'] = ['Songti SC']  # 配置以后可以显示中文
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    for i in range(n):  # 通过循环显示多个y
        plt.plot(x, y[:, i], marker='o', markersize=my_makerize, color=my_color[i], linewidth=my_linewidth, linestyle="solid",
                 label=my_label[i])
    plt.title(my_title, fontsize=25)  # 设置图的标题
    plt.legend(loc="best")  # 图例放到图中的最佳位置
    plt.xlabel(my_xlabel, fontsize=15)  # 设置横轴名称以及字体大小
    plt.ylabel(my_ylabel, fontsize=15)  # 设置纵轴
    plt.show()

注:代码段中,配置显示中文和正常显示负号的代码是必须的,否则会出错。

测试用例如下:

import numpy as np
x=range(-5,10,1)
y1=[i*i for i in x]
y2=[-i*i*i/10 for i in x]
y3=[2*i+1 for i in x]
y=np.array([y1,y2,y3]).T #一个列对应一个因变量
#----显示
my_title="图题" #设置图题名称
my_xlabel="自变量" #设置横轴名称
my_ylabel="因变量" # 设置纵轴名称
my_label=["y1_x","y2_x","y3_x"] #设置图例名称,list
my_color=["black","red","blue"] #设置颜色,list
plot_x_ys(1,x,y,my_title,my_label,my_xlabel,my_ylabel,my_color)

运行结果如下:​​​​​​​

封装以后主函数的代码清爽很多。从运行结果可以看出, 图中可正常显示中文,且坐标轴负号显示正常。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Dfreedom.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值