import matplotlin.pyplot as plt
import numpy as np
- plt. 先生成一个画布,在画布中生成的区域进行画图,当然plt也可以划分区域
plt.subplot(111)
- ax. 先生成一画布,在画布上选定一个区域进行画图
add_subplot(xyz)第一个数字x代表行数,第二个数字y代表列数,第三个数字z表示取第z个小区域(先取第一行,从左到右)
- 但是撇开位置不讲,两个图形没有图像上的区别
plt.
fig=plt.figure(num=1,figsize=(6,4))# 创建一个图形底板
plt.plot([1,2,3,4],[1,2,3,4])
# plt也可以直接划分区域
# plt.subplot(111)
plt.show()
ax.
fig=plt.figure(num=1,figsize=(4,4))
# add_subplot(xyz)第一个数字x代表行数,第二个数字y代表列数,第三个数字z表示取第z个小区域(先取第一行,从左到右)
ax=fig.add_subplot(231)
plt.plot([1,2,3,4],[1,2,3,4])
plt.show()
PS:以下使用ax.
,使用plt.可跳下面
- 在画图之前,一般在画布上选定一个区域然后创建子图,如:
fig=plt.figure(num=1,figsize=(4,4))
ax1=fig.add_subplot(221)###可从图中看到,我们的画布是分为2x2的区域
ax1.plot([1,2,3,4],[1,2,3,4])
ax2=fig.add_subplot(222)
ax2.plot([1,2,3,4],[2,2,3,4])
ax3=fig.add_subplot(223)
ax3.plot([1,2,3,4],[1,2,2,4])
ax4=fig.add_subplot(224)
ax4.plot([1,2,3,4],[1,2,3,3])
plt.show()
ax.set_xlim(1,7.1)#x轴从1到7.1
ax.set_ylim(40,100)#y轴从40到100
#设置显示的刻度
ax.set_xticks(np.linspace(1,7,7))#np.linspace()函数为等差数列,1至7的7个数组成的等差数列1,2,3,4,5,6,7,
ax.set_yticks(np.linspace(50,100,6))#关于等差数列,想了解的可以参看numpy的用法
#设置刻度标签
ax.set_xticklabels(["星期一","星期二","星期三","星期四","星期五","星期六","星期日"],fontproperties="SimHei"\
,fontsize=12)
#这里用到了属性fontproperties可以单独设置x轴标签的字体,也可以用fontsize设置字体大小,还可以用color
设置字的颜色
ax.set_yticklebels(["50kg","60kg","70kg","80kg","90kg","100kg"],fontsize=12)
- axis: 可选"x",“y”,“both”,默认"both",分别代表,对x轴操作,对y轴操作,对两个轴都操作。
- direction: 可选 “in”,“out”,"inout"代表,刻度线显示在坐标轴里面,坐标轴外边,双边
ax.set_xlabel("星期")#添加x轴坐标标签,后面看来没必要会删除它,这里只是为了演示一下。
ax.set_ylabel("销售量",fontsize=16)#添加y轴标签,设置字体大小为16,这里也可以设字体样式与颜色
ax.set_title("某某水果店一周水果销售量统计图",fontsize=18,backgroundcolor='#3c7f99'\
fontweight='bold',color='white',verticalalignment="baseline")#标题(表头)
PS:以下使用plt.
- 只指定一个数组元素时,表示为纵坐标的值,横坐标默认是数组下标
- 也可以直接都指定横坐标和纵坐标
# 纵坐标折线图
fig=plt.figure(num=1,figsize=(6,4))# 创建一个图形底板
plt.plot([3,1,4,5,2])# 只指定一个数组元素,表示为中坐标的值,横坐标默认是数组下标
plt.ylabel("Grade")
plt.savefig("test1",dpi=600)# dpi 修改输出质量,表示每一英寸内像素点的值
plt.show()
# 横坐标和纵坐标折线图
plt.ylabel("Grade")
plt.plot([0,2,4,6,8],[3,1,4,5,2])# 指定横坐标和纵坐标
plt.axis([0,10,0,6])# 表示横坐标的尺度为[0,10],纵坐标为[0,6]
plt.show()
- x:x轴的数据,列表或者数组,可选
- y:y轴数据,列表或者数组
- format_string:控制曲线的格式字符串,可选,,可选由颜色字符、风格字符和标记字符组成。
- kwargs:第二组或者更多(x,y,format_string)
颜色字符 | 说明 |
---|---|
‘b’ | 蓝色 |
‘g’ | 绿色 |
‘r’ | 红色 |
‘c’ | 青绿色 cyan |
‘m’ | 洋红色 magenta |
‘y’ | 黄色 |
‘k’ | 黑色 |
‘w’ | 白色 |
‘0.8’ | 灰度值字符串 |
风格字符 | 说明 |
---|---|
‘-’ | 实线 |
‘–’ | 破折线 |
‘-.’ | 点划线 |
‘:’ | 虚线 |
‘’ ’ ’ | 无线条 |
标记字符 | 说明 |
---|---|
‘.’ | 点标记 |
‘o’ | 实心圈标记 |
‘^’ | 上三角标记 |
'*' |
星形标记 |
‘+’ | 十字标记 |
‘x’ | x标记 |
# 展示不同的函数画图
a=np.arange(10)
plt.plot(a,a*1.5,'go-',a,a*2.5,'rx',a,a*3.5,'*',a,a*4.5,'b-.')
plt.show()
plt.rcParams["font.family"]="SimHei"
matplotlib.rcParams['font.family']='STSong'
matplotlib.rcParams['font.size']=20# 字体大小
a=np.arange(0.0,5.0,0.02)
plt.xlabel("横轴:时间")
plt.ylabel("纵轴:振幅")
plt.plot(a,np.cos(2*np.pi*a),'r--')
plt.show()
上面都是简单语法介绍,下面开始画甘特图,这个在python可视化中是非常重要的
plt.bar():正常柱状图,常见的统计图;
plt.barh():横向的柱状图,可以理解为正常柱状图旋转了90°。
plt.bar()
plt.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
示例代码:
import matplotlib.pyplot as plt
import numpy as np
y=[20,30,15,25,15]
N=5
index=np.arange(N)
plt.bar(x=index,height=y)
plt.show()
plt.barh()
plt.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
import matplotlib.pyplot as plt
import numpy as np
y=[20,30,15,25,15]
N=5
index=np.arange(N)
# plt.bar(x=index,height=y)
# plt.show()
plt.barh(y=index,width=y)
plt.show()
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
from matplotlib import ticker
%matplotlib inline
# 第一个坐标轴和图
fig = plt.figure(figsize=(8,5), dpi=80)
ax = fig.add_subplot(1,1,1)
plt.subplot(1, 1, 1)
# 画多个图,传递多个不同的x轴刻度
x = [i for i in range(25)] # x轴标准刻度
x1 = [i-0.2 for i in range(25)] # 第一个图x轴左偏移0.2
x2 = [i+0.2 for i in range(25)] # 第二个图x周右偏移0.2,防止重叠
xx = data3['sku_pri'].to_list() # x周的刻度显示
ax.set_ylabel('y轴1的名称')
ax.set_xlabel('x周名字')
plt.bar(x1, data3['num_sales']/10000, width=0.4, label='第一张图')
plt.ylim(0,4000)
plt.xticks(x,xx) # x周刻度显示
plt.title('plt.plot()综合应用')
ax.legend(loc='upper left')
# 第二个坐标轴和图
ax2 = ax.twinx()
ax2.spines['right'].set_position(('axes', 1.0))
ax2.set_ylabel('y轴2的名称')
plt.bar(x2, data3['lk_num']/10000, width=0.4, color='orange', label='第二张图')
plt.ylim(0,200)
plt.xticks(x,xx)
ax2.legend(loc='upper center')
# 第三个坐标和图
ax3 = ax.twinx()
ax3.spines['right'].set_position(('axes', 1.1)) # 1.1向右便宜避免重叠
ax3.set_ylabel('y轴3的名称')
plt.plot(x, data3['lk_ra'], marker='*',color='purple', label='第三张图')
plt.ylim(0,0.12)
# y轴3设置刻度未百分比
ax3.yaxis.set_major_locator(MultipleLocator(0.02))
ax3.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=1, decimals=0))
plt.xticks(x,xx)
ax3.legend(loc='upper right')
# plt.savefig('保存图片名称'+'.png')
plt.show()
数据如下:
python读取excel需要了解的知识点这里!!!
代码:
ps:注释掉的colors的那个配色更好看
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from colour import Color
# import xlrd 引擎
# 正常显示中文和符号
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 读取数据表,获取工位加工时长和各个工位开始加工时间
df1=pd.read_excel('test.xls',sheet_name='continue_time',index_col='YM')
df2=pd.read_excel('test.xls',sheet_name='start_time',index_col='YM')
# print(df1.head())
# print(df2.head())
CJS=['CJ1','CJ2','CJ3','CJ4']
YMS=['YM4','YM5','YM2','YM7','YM10','YM1','YM8','YM6','YM3','YM9']
# continue_time:各个工位加工时长,start_time:各个工位开始加工时间
continue_time=[]
start_time=[]
for cj in CJS:
continue_time.append([ym for ym in df1[cj][YMS]])
start_time.append([ym for ym in df2[cj][YMS]])
print("continue_time:",continue_time)
# print("start_time:",start_time)
# 获取数组大小,用于之后的循环
m=range(len(continue_time)) # 4 个机器
n=range(len(continue_time[0])) # 10 个工件
# print("m=%s,n=%s" %(m,n))
# 绘图
# 指定每一个水平柱子颜色
# red=Color('red')
# colors=list(red.range_to(Color('purple'),14))
# colors=[color.rgb for color in colors]
# print("colors:",colors)
colors = ['r', 'pink', 'orange', 'y', 'g', 'b', 'deeppink', 'purple', 'brown', 'black']
# 设置画布大小和分辨率
plt.figure(figsize=(20,8),dpi=200)
# barh:水平柱状图,设置循环迭代以绘制层叠效果
for i in m:
for j in n:
plt.barh(m[i] + 1, continue_time[i][j], left=start_time[i][j], color=colors[j])
# print("机器=%s,工件=%s---------------------------" %(i,j))
# print("m[i] + 1=%s, continue_time[i][j]=%s, left=start_time[i][j]=%s" % ( m[i] + 1, continue_time[i][j], start_time[i][j]))
plt.title('疫苗生产甘特图',fontsize=17)
# 命名
labels=['']*len(continue_time[0]);
for f in n:
labels[f]='YM%d'%(f+1)
print(labels)
# 添加图例
patches=[mpatches.Patch(color=colors[i],label="{:s}".format(labels[i])) for i in range(len(continue_time[0]))]
plt.legend(handles=patches,loc=4)
# XY标签
plt.xlabel('加工时间/分钟',fontsize=15)
plt.ylabel('各工位加工流程',fontsize=15)
# XY轴刻度
plt.yticks([1,2,3,4],['CJ1','CJ2','CJ3','CJ4'])
# 网格线
# plt.grid(linestyle='--',alpha=0.5)
plt.savefig('gatte.jpg')
plt.show()
结果展示: