绘制条形图,是相关命令的具体应用。
详细内容标注在注释里:
import numpy as np
'''绘制折线图'''
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 用于正常显示中文
#plt.rcParams['font.family'] = ['sans-serif']#如果是windows系统请去掉这行注释
#plt.rcParams['font.sans-serif'] = ['SimHei']#如果是windows系统请去掉这行注释
plt.rcParams["font.family"] = 'Arial Unicode MS'
#用于正常显示符号
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('ggplot')
#横坐标的长度
length = 5
#设置横坐标
x = np.arange(0,length*2,2)
x_label = ['第一学期','第二学期','第三学期','第四学期','第五学期']
#设置纵坐标,使用了numpy作二维数组
# 第一行为语文成绩,第二行为数学成绩,第三行为英语成绩
# 共有四列,表示四个学期
y = np.array([[123,115,108,122,119],
[130,120,140,139,130],
[140,145,155,109,140]])
f,ax = plt.subplots(figsize=(6,6),facecolor='white')
#设置背景,默认为灰色
ax.set(facecolor='white')
#绘制折线图操作
plt.plot(x, y[0,:],marker='o',label='语文成绩')
plt.plot(x, y[1,:],marker='*',label='数学成绩')
plt.plot(x, y[2,:],marker='x',label='英语成绩')
#设置x轴,对应y轴的相关操作是一样的
plt.xticks(x, x_label,fontsize=13)#设置x轴的每个刻度值
plt.xlabel(u"学期")
#设置标题
#plt.title('小明第一至第四学期成绩变化折线图',fontsize=18,fontweight='bold')
ax.set_title('小明第一至第四学期成绩变化折线图',fontsize=18,fontweight='bold')
#设置图例,loc表示位置,有9种不同的位置
plt.legend(loc='upper left')
#将每个值标志在图上
for i in range(np.size(y,1)):
for j in range(np.size(y,0)):
ax.text(x[i],y[j,i],"%s"%str(y[j,i]), fontsize=12)
#删除所有边框
ax.spines['right'].set_visible(True)
ax.spines['top'].set_visible(True)
ax.spines['bottom'].set_visible(True)
ax.spines['left'].set_visible(True)
#显示网格
ax.grid(True)
#如果要保存,去掉这行的注释
#plt.savefig('小明成绩变化图.png')
#显示图案
plt.show()
补充,在一张图中画多个子图。
法一:通过ax命令绘制子图
#!/usr/local/bin/python3
import xlwt
import xlrd
import numpy as np
'''绘制折线图,包括多个子图'''
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 用于正常显示中文
#plt.rcParams['font.family'] = ['sans-serif']#如果是windows系统请去掉这行注释
#plt.rcParams['font.sans-serif'] = ['SimHei']#如果是windows系统请去掉这行注释
plt.rcParams["font.family"] = 'Arial Unicode MS'
#用于正常显示符号
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('ggplot')
#横坐标的长度
length = 5
#设置横坐标
x = np.arange(0,length*2,2)
x_label = ['第一学期','第二学期','第三学期','第四学期','第五学期']
y1 = [123,115,108,122,119]
y2 = [130,120,140,139,130]
y3 = [140,145,155,109,140]
f,ax = plt.subplots(nrows=3,ncols=1,figsize=(6,6),facecolor='white')
#为三个子图设置一个大标题
f.suptitle('小明第一至第四学期语文成绩变化折线图',fontsize=14,fontweight='bold')
#绘制子图1
#设置背景,默认为灰色
ax[0].set(facecolor='white')
#绘制折线图操作
ax[0].plot(x, y1,marker='o',label='语文成绩')
ax[0].set_xlabel(u"学期")
ax[0].set_ylabel(u"语文分数")
#绘制子图2
ax[1].plot(x, y2,marker='*',label='数学成绩')
ax[1].set_xlabel(u"学期")
ax[1].set_ylabel(u"数学分数")
#ax[1].set_title('小明第一至第四学期数学成绩变化折线图',fontsize=14)
#绘制子图3
ax[2].plot(x, y3,marker='x',label='英语成绩')
ax[2].set_xlabel(u"学期")
ax[2].set_ylabel(u"英语分数")
#ax[2].set_title('小明第一至第四学期英语成绩变化折线图',fontsize=14)
#将每个值标志在图上
for i in range(len(y3)):
ax[2].text(x[i],y3[i],"%s"%str(y3[i]), fontsize=12)
#显示图案
plt.show()
这种方法通过ax画图,ax不方便设置坐标轴的刻度和绘制标题,因为图片之间的距离太小了所以会被挡住。
法二:通过ax=plt.subplot(2,1,1)指定的方式,可以通过plt绘制子图。
#!/usr/local/bin/python3
import xlwt
import xlrd
import numpy as np
'''绘制折线图,包括多个子图'''
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 用于正常显示中文
#plt.rcParams['font.family'] = ['sans-serif']#如果是windows系统请去掉这行注释
#plt.rcParams['font.sans-serif'] = ['SimHei']#如果是windows系统请去掉这行注释
plt.rcParams["font.family"] = 'Arial Unicode MS'
#用于正常显示符号
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('ggplot')
#横坐标的长度
length = 5
#设置横坐标
x = np.arange(0,length*2,2)
x_ticks = ['第一学期','第二学期','第三学期','第四学期','第五学期']
y1 = [123,115,108,122,119]
y2 = [130,120,140,139,130]
y3 = [140,145,155,109,140]
#为三个子图设置一个大标题
fig = plt.figure(figsize=(8,6))
#绘制子图1
#设置背景,默认为灰色
ax0 = plt.subplot(3,1,1)
ax0.set(facecolor='white')
#绘制折线图操作
plt.plot(x, y1,marker='o',label='语文成绩')
plt.xticks(x,x_ticks)
plt.xlabel(u"学期")
plt.ylabel(u"语文分数")
plt.title('小明第一至第四学期语文成绩变化折线图',fontsize=14)
#绘制子图2
ax1 = plt.subplot(3,1,2)
plt.plot(x, y1,marker='*',label='数学成绩')
plt.xticks(x,x_ticks)
plt.xlabel(u"学期")
plt.ylabel(u"数学分数")
plt.title('小明第一至第四学期数学成绩变化折线图',fontsize=14)
#绘制子图3
ax2 = plt.subplot(3,1,3)
plt.plot(x, y1,marker='x',label='英语成绩')
plt.xticks(x,x_ticks)
plt.xlabel(u"学期")
plt.ylabel(u"数学分数")
plt.title('小明第一至第四学期英语成绩变化折线图',fontsize=14)
for i in range(len(y3)):
ax2.text(x[i],y3[i],"%s"%str(y3[i]), fontsize=12)
#显示图案
plt.show()
这样画图有些不好,因为子图直接的间隔太近了,标题或是xlabel容易被遮挡。
如果竖着摆放:
#!/usr/local/bin/python3
import xlwt
import xlrd
import numpy as np
'''绘制折线图,包括多个子图'''
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 用于正常显示中文
#plt.rcParams['font.family'] = ['sans-serif']#如果是windows系统请去掉这行注释
#plt.rcParams['font.sans-serif'] = ['SimHei']#如果是windows系统请去掉这行注释
plt.rcParams["font.family"] = 'Arial Unicode MS'
#用于正常显示符号
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('ggplot')
#横坐标的长度
length = 5
#设置横坐标
x = np.arange(0,length*2,2)
x_ticks = ['第\n一\n学\n期','第\n二\n学\n期','第\n三\n学\n期','第\n四\n学\n期','第\n五\n学\n期']
y1 = [123,115,108,122,119]
y2 = [130,120,140,139,130]
y3 = [140,145,155,109,140]
fig = plt.figure(figsize=(8,6))
#绘制子图1
#设置背景,默认为灰色
ax0 = plt.subplot(1,3,1)
#绘制折线图操作
plt.plot(x, y1,marker='o',label='语文成绩')
plt.xticks(x,x_ticks)
plt.xlabel(u"学期")
plt.ylabel(u"语文分数")
plt.title('语文成绩',fontsize=14)
#绘制子图2
ax1 = plt.subplot(1,3,2)
plt.plot(x, y2,marker='*',label='数学成绩')
plt.xticks(x,x_ticks)
plt.xlabel(u"学期")
plt.ylabel(u"数学分数")
plt.title('数学成绩',fontsize=14)
#绘制子图3
ax2 = plt.subplot(1,3,3)
plt.plot(x, y3,marker='x',label='英语成绩')
plt.xticks(x,x_ticks)
plt.xlabel(u"学期")
plt.ylabel(u"数学分数")
plt.title('英语成绩',fontsize=14)
for i in range(len(y3)):
plt.text(x[i],y3[i],"%s"%str(y3[i]), fontsize=12)
#显示图案
plt.show()
y轴的坐标仍会被遮挡,这里还需要进一步的改进。
写程序方面的小技巧:
可以看到画每一个子图的时候有许多重复的部分,因此我们一般会写成循环或是函数的形式。
①循环形式:
需要建立一个数组,而且应该是二维或是更高维的数组,使用numpy建立多维数组很方便。
#!/usr/local/bin/python3
import xlwt
import xlrd
import numpy as np
'''绘制折线图,包括多个子图,循环形式'''
from matplotlib import pyplot as plt
from matplotlib import font_manager
# 用于正常显示中文
#plt.rcParams['font.family'] = ['sans-serif']#如果是windows系统请去掉这行注释
#plt.rcParams['font.sans-serif'] = ['SimHei']#如果是windows系统请去掉这行注释
plt.rcParams["font.family"] = 'Arial Unicode MS'
#用于正常显示符号
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('ggplot')
#横坐标的长度
length = 5
#设置横坐标
x = np.arange(0,length*2,2)
x_ticks = ['第\n一\n学\n期','第\n二\n学\n期','第\n三\n学\n期','第\n四\n学\n期','第\n五\n学\n期']
y = np.array([[123,115,108,122,119],
[130,120,140,139,130],
[140,145,155,109,140]])
label_list = ['语文成绩','数学成绩','英语成绩']
ylabel_list = ['语文分数','数学分数','英语分数']
title_list = ['语文成绩标题','数学成绩标题','英语成绩标题']
#为三个子图设置一个大标题
fig = plt.figure(figsize=(8,6))
nrow = 1
ncol = 3
for i in range(3):
ax = plt.subplot(nrow,ncol,i+1)#注意这里需要+1,因为不是从0开始的
#绘制折线图操作
plt.plot(x, y[i,:],marker='o',label=label_list[i])
plt.xticks(x,x_ticks)
plt.xlabel(u"学期")
plt.ylabel(ylabel_list[i])
plt.title(title_list[i],fontsize=14)
for j in range(np.size(y,1)):
plt.text(x[j],y[i,j],"%s"%str(y[i,j]), fontsize=12)
#显示图案
plt.show()
②写成函数形式:
#!/usr/local/bin/python3
import xlwt
import xlrd
import numpy as np
'''绘制折线图,包括多个子图,函数形式'''
from matplotlib import pyplot as plt
from matplotlib import font_manager
def plot_func(nrow,ncol,i,x,y,input_label,input_x_tick,input_y_label,input_title):
ax = plt.subplot(nrow,ncol,i+1)#注意这里需要+1,因为不是从0开始的
#绘制折线图操作
plt.plot(x, y,marker='o',label=input_label)
plt.xticks(x,input_x_tick)
plt.xlabel(u"学期")
plt.ylabel(input_y_label)
plt.title(input_title,fontsize=14)
for j in range(len(y)):
plt.text(x[j],y[j],"%s"%str(y[j]), fontsize=12)
# 用于正常显示中文
#plt.rcParams['font.family'] = ['sans-serif']#如果是windows系统请去掉这行注释
#plt.rcParams['font.sans-serif'] = ['SimHei']#如果是windows系统请去掉这行注释
plt.rcParams["font.family"] = 'Arial Unicode MS'
#用于正常显示符号
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('ggplot')
#横坐标的长度
length = 5
#设置横坐标
x = np.arange(0,length*2,2)
x_tick = ['第\n一\n学\n期','第\n二\n学\n期','第\n三\n学\n期','第\n四\n学\n期','第\n五\n学\n期']
y = np.array([[123,115,108,122,119],
[130,120,140,139,130],
[140,145,155,109,140]])
#为三个子图设置一个大标题
fig = plt.figure(figsize=(8,6))
nrow = 1
ncol = 3
plot_func(nrow,ncol,0,x,y[0,:],'语文成绩',x_tick,'语文分数','语文成绩标题')
plot_func(nrow,ncol,1,x,y[1,:],'数学成绩',x_tick,'数学分数','数学成绩标题')
plot_func(nrow,ncol,2,x,y[2,:],'英语成绩',x_tick,'英语分数','英语成绩标题')
#显示图案
plt.show()