目录
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)
运行结果如下:
封装以后主函数的代码清爽很多。从运行结果可以看出, 图中可正常显示中文,且坐标轴负号显示正常。
参考阅读
发表评论