通过Matplotlib绘制条形图

这篇博客介绍了如何使用Python的matplotlib库绘制折线图,并展示了两种创建多子图的方法。第一种通过ax对象绘制,第二种通过plt.subplot()指定。每种方法都涉及到设置标题、坐标轴、图例和数据标注,以及调整子图布局。同时,代码展示了如何通过循环和函数化来简化重复的绘图步骤。
摘要由CSDN通过智能技术生成

绘制条形图,是相关命令的具体应用。
详细内容标注在注释里:

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

多个子图1

这种方法通过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()

绘制多个子图2
这样画图有些不好,因为子图直接的间隔太近了,标题或是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()
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值