程序功能:已封装的python中的Matplotlib绘图模块,可绘制科技论文中简单的数据可视化。可实现绘制曲线图、柱状图。可实现线条类型、颜色、宽度的设置、可实现对刻度线坐标字体字号设置、可实现图例、网格设置、可实现图中图等其他设置。
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from pylab import *
import numpy as np
from matplotlib.font_manager import FontProperties
#加中文语句
# plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
color = ['b','g','r','c','m','y','k','w'] #颜色选择
style = ['-','--','-.',':','.',',','o','v',]#线条类型选择
loc=['upper right','upper left','lower left','lower right','right','center left',
'center right','lower center','upper center','center'] #图例位置选择
'''
titlename:图片标题名称
xlim:设置x坐标轴的范围(可加可不加)
ylim:设置y坐标轴的范围(可加可不加)
xlabel:图片x轴名称
ylabel:图片y轴名称
ticks:设置关键点的记号标签
a,b:绘图的图片的长宽
'''
class Fig:
def __init__(self,a,b):
# self.figure=plt.figure(figsize=(a, b)) #画图中图使用,创建图中图界面并设置图片长和宽
self.figure,self.ax = plt.subplots(figsize=(a,b))
self.show=plt.show()
#绘图
'''
x:输入x的数据代表x轴长度时间
y:输出y的数据是一个列表,如[d,e,f],与输入x个数对应,也是代表三组数据,出三条线
lable:图例的名称 是一个列表,里面是字符串,如["第一个图例","第二个图例","第三个图例"]
linewidth:线条宽度
color:线条颜色,是一个列表,里面是字符串。如["r","g","y"]
style:线条类型选择
leged:图例的位置(1,1)这种类型
titlename:图的标题名
xlabel:x轴名称
ylabel:y轴名称
a:是否选择一张图中出多个图,1代表选择,其他代表不选择
b:plt.subplot(b,c,d)函数里的画几个图
c:plt.subplot(b,c,d)画几列
d:plt.subplot(b,c,d)里的第几个
e:是否选择自己设置坐标轴刻度,1代表选择,其他数字不选择
f:x轴坐标轴刻度范围,(a,b)这种形式,从左到右
g:y轴坐标轴刻度范围,(a,b)这种形式,从下到上
font:设置每个图例的字体字号,与输入y对应,为列表数据,可选择font1(英文),font2(中文宋体)
fony:为y轴坐标字体选择,可选择font1(英文),font2(中文宋体)
'''
def fig(self,x,y,lable,linewidth,color,style,leged,titlename,xlabel,ylabel,a,b,c,d,e,f,g,font,fonty):
#判断是否好几个图
if a == 1:
plt.subplot(b,c,d)
#设置字体为,字号
font1 = FontProperties(fname=r"c:\windows\fonts\times.ttf",size=25)#英文Times New Roman字体
font2 = FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=25)#中文宋体
#为方便选择坐标刻度字体
for i in range(len(font)):
if font[i]==1:
font[i]=font1
else:
font[i]=font2
#判断是否需要自制坐标轴刻度,1代表需要
if e==1:
plt.xlim(f)#设置坐标轴的刻度,范围 例(0,10)
plt.ylim(g)#设置坐标轴的刻度,范围 例(-1,1)
for i in range(len(y)):#绘制y条线
plt.plot(x,y[i],label=lable[i],linestyle=style[i],linewidth=linewidth,color=color[i])
# plt.legend(loc=loc[0],bbox_to_anchor=leged,prop=font[i])
#图例参数解析 bbox_to_anchor=(num1,num2) num1 用于控制 legend 的左右移动,值越大越向右边移动,num2 用于控制 legend 的上下移动,
# 值越大,越向上移动。用于微调图例的位置。
#为方便选择坐标y轴刻度字体设置
if fonty==1:
fonty=font1
else:
fonty=font2
plt.legend(loc=loc[0],bbox_to_anchor=leged,prop=font[0])#加图例 位置信息,字体,字体大小
plt.title(titlename)
plt.xlabel(xlabel,fontproperties=font1,size=30)#图片x轴名称,字体,字号
plt.ylabel(ylabel,fontproperties=fonty,size=35)#图片y轴名称,字体,字号
# 添加网格显示
plt.grid(linestyle="-", alpha=0.8)
plt.tick_params(direction='in',labelsize=25)#坐标字体大小设置 direction='in'刻度线显示在绘图区内测
#如下为设置坐标轴刻度的字体
labels = self.ax.get_xticklabels() + self.ax.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
#绘制图中图
'''
left1,bottom1,width1,height1 分别代表图中图距离y,x轴的距离,图中图本身的长度和宽度
x,y 代表 图中图需要画出的x,y的图形
linewidth,color 图中图中线条的宽度和颜色
xlim,ylim 图中图所要绘制的x,y的大小长高
xlabel,ylabel,title 图中图中横坐标,纵坐标 标题的题目
'''
def image(self,left1,bottom1,width1,height1,x,y,linewidth,color,style,xlim,ylim,xlabel,ylabel,title):
# left1,bottom1,width1,height1=left1,bottom1,width1,height1#图中图位置和宽高
ax2=self.figure.add_axes([left1,bottom1,width1,height1])
for i in range(len(y)):#图中图中绘制y条线
plt.plot(x,y[i],linewidth=linewidth,linestyle=style[i],color=color[i])
plt.grid(linestyle="-", alpha=0.8) #加网格
plt.xlim(xlim)#图中图的横坐标范围
plt.ylim(ylim)#图中图的纵坐标范围
ax2.set_xlabel(xlabel) #设置x轴名字
ax2.set_ylabel(ylabel)#设置y轴名字
ax2.set_title(title)#设置题目
plt.tick_params(direction='in',labelsize=15)#坐标字体大小设置
#如下为设置坐标轴刻度的字体样式
labels = ax2.get_xticklabels() + ax2.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
#绘制散点图
def figur(self,x,y,color,label):#x,y,颜色,图例名称
plt.scatter(x,y,c=color,label=label)#画散点图
plt.legend(loc='upper left', frameon=False)#加图例
#绘制柱状图
'''
x:x轴数据
y:y轴数据
color:柱状图颜色
title:图标题目
ylabel:y轴名称
xlabel:x轴名称
'''
def cylinder(self,left1,bottom1,width1,height1,x,y,color,width,ylim,title,xlabel,ylabel,a,b,c):
ax2=self.figure.add_axes([left1,bottom1,width1,height1])
plt.ylim(ylim)#图中图的纵坐标范围
font1 = FontProperties(fname=r"c:\windows\fonts\times.ttf",size=20)
font2 = FontProperties(fname=r"c:\windows\fonts\simsun.ttc",size=20)#中文宋体
plt.bar(x, y, color = color, width=width,align = 'center')
for x, y in enumerate(y):
plt.text(x, y , '%s' % y, ha='center', va='bottom',fontproperties=font1,size=20)#柱状图上方数字显示
plt.ylim(ylim)#图中图的纵坐标范围
plt.title(title)
plt.ylabel(ylabel)
plt.xlabel(xlabel,fontproperties=font2)
plt.grid(linestyle="-", alpha=0.7)
plt.tick_params(direction='in',labelsize=16)#坐标字体大小设置 direction='in'刻度线显示在绘图区内测
plt.xticks(fontproperties = font1,size = 25) #选择x轴坐标字体设置
labels = ax2.get_xticklabels() + ax2.get_yticklabels()
[label.set_fontname('Times New Roman') for label in labels]
#添加文字,第一个参数是x轴坐标,第二个参数是y轴坐标,以数据的刻度为基准,c表示要加的文字
# plt.text(a,b,c,fontdict={'size':'16.5','color':'k'})
plt.text(a,b,c,fontproperties=font2) #图上文字显示字体字号设置
plt.show()
# #测试代码
# time = np.arange(0, 10,0.01)
# sin = np.sin(time)
# cos = np.cos(time)
# tt=Fig(8,5)
# #demo示例
# tt.fig(time,[sin,cos],['sin(x)','cos(x)'],2,['r','b'],['-','-.'],(1,1),
# " ",'Time(sec)','yaw Angle(rad)',2,3,1,2,1,(0,10),(-1.5, 2.5))
# #绘制图中图
# tt.image(0.3,0.65,0.3,0.2,time,[sin,cos],2,['r','b'],['-','-.'],
# (2,8),(-0.8,0.8),"","","")
# # x=['ff','2','3','4','5','6']
# # y=[81.7315,32.9466,6.2922,86.9391,55.3920,7.9238]
# # tt.cylinder(0.3,0.65,0.3,0.2,x,y,'b',2,(-1,1),'','','')
|