matplotlib使用

文章目录

    • 基本语法
      • 导入库
      • plt 和ax.区别
    • ax. 用法
      • 子图创建-展示不同的分区区域
      • 设置刻度范围:
      • 显示刻度
      • 设置刻度标签
      • tick_params()函数
      • 添加轴坐标标签,表头,图例
    • plt.用法
      • 普通折线图
      • plt.plot(x,y,format_string,**kwargs)函数说明:
      • 中文显示`plt.rcParams["font.family"]="SimHei"`
    • matplotlib画柱状图
      • plt.bar()、plt.barh()参数解释
      • plt.bar()综合应用
      • plt.barh()画甘特图

基本语法

导入库

import matplotlin.pyplot as plt
import numpy as np

plt 和ax.区别

  • 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()

matplotlib使用_第1张图片

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()

matplotlib使用_第2张图片


ax. 用法

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()

matplotlib使用_第3张图片

设置刻度范围:

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)

matplotlib使用_第4张图片

tick_params()函数

  • 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")#标题(表头)


plt.用法

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()

plt.plot(x,y,format_string,**kwargs)函数说明:

  • 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()

matplotlib使用_第5张图片

中文显示plt.rcParams["font.family"]="SimHei"

  • 加入以上代码,中文就可以正常显示
    属性
    matplotlib使用_第6张图片
  • 字体选择
    matplotlib使用_第7张图片
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可视化中是非常重要的

matplotlib画柱状图

plt.bar()、plt.barh()参数解释

plt.bar():正常柱状图,常见的统计图;
plt.barh():横向的柱状图,可以理解为正常柱状图旋转了90°。

plt.bar()

plt.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
  • x:表示x坐标,数据类型为int或float类型,刻度自适应调整;也可传dataframe的object,x轴上等间距排列;
  • height:表示柱状图的高度,也就是y坐标值,数据类型为int或float类型
  • width:表示柱状图的宽度,取值在0~1之间,默认为0.8;
  • bottom:柱状图的起始位置,也就是y轴的起始坐标
  • align:柱状图的中心位置,默认"center"居中,可设置为"lege"边缘;
  • color:柱状图颜色;
  • edgecolor:边框颜色;
  • linewidth:边框宽度;
  • tick_label:下标标签;
  • log:柱状图y周使用科学计算方法,bool类型;
  • orientation:柱状图是竖直还是水平,竖直:“vertical”,水平条:“horizontal”;

示例代码:

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()

matplotlib使用_第8张图片

plt.barh()

plt.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
  • y:表示y坐标,数据类型为int或float类型,刻度自适应调整;也可传dataframe的object,y轴上等间距排列;
  • width:表示柱状图的长度,也就是x坐标值,数据类型为int或float类型;
  • height:表示柱状图的高度,取值在0~1之间,默认为0.8;
  • 其他参数与plt.bar()类似。
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()

matplotlib使用_第9张图片

plt.bar()综合应用

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()

matplotlib使用_第10张图片

plt.barh()画甘特图

数据如下:
python读取excel需要了解的知识点这里!!!

matplotlib使用_第11张图片
matplotlib使用_第12张图片

代码:
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()

结果展示:

matplotlib使用_第13张图片

你可能感兴趣的:(python,matplotlib,python,机器学习)