Matplotlib绘制条形图的方法你知道吗


Posted in Python onMarch 21, 2022
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import font_manager

一、一般条形图

一般条形图使用 pyplot.bar()函数绘制,其形式及参数如下:

matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
主要参数解释:
# x:一个数组或者列表,代表需要绘制的条形图的x轴的坐标点。
# height:一个数组或者列表,代表需要绘制的条形图y轴的坐标点。
# width:每一个条形图的宽度,默认是0.8的宽度。
# bottom:y轴的基线,默认是0,也就是距离底部为0.
# align:对齐方式,{'center','edge'},默认是center,居中对齐;edge为靠边对齐,具体靠右边还是靠左边,看width的正负。
# color:条形图的颜色。
# edgecolor : 条形图边框的颜色。
# linewidth  : 条形图边框的宽度。如果为 0,则不绘制边框

示例:

某天电影票房数据:

movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}

直接通过获取字典的键值作为x,y轴数据

#票房单位亿元
movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}
# 中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 13
# 设置图大小
plt.figure(figsize=(15,8))

x = list(movies.keys()) # 获取x轴数据(字典的键)
y = list(movies.values()) # 获取y轴数据(字典的值)

plt.bar(x,y,width=0.5,bottom=0,align='edge',color='g',edgecolor ='r',linewidth=2)

# 绘制标题
plt.title("电影票房数据",size=26)

# 设置轴标签
plt.xlabel("电影名",size=28)
plt.ylabel("票房/亿",size=28)

plt.show()

Matplotlib绘制条形图的方法你知道吗

也可以利用字典创建DataFrame索引,通过data参数传入

#票房单位亿元
movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}
movies_df = pd.DataFrame(data={"name":list(movies.keys()),"tickes":list(movies.values())}) #通过字典创建DataFrame索引
font = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF',size=12)  # 使用font_manager模块设置中文

# 设置图的大小,传入x,y
plt.figure(figsize=(14,5))

# 使用plt.bar()绘制条形图
plt.bar("name","tickes",data=movies_df,width=0.5,bottom=0,align='edge',color='g',edgecolor ='r',linewidth=2)

#设置X轴刻度,设置字体,也可以设置字体大小size
plt.xticks(fontproperties=font)

# 设置标题
plt.title("电影票房数据",size=30)
#设置X,Y轴名字
plt.ylabel('票房',fontproperties=font,size=25)
plt.xlabel('影片名字',fontproperties=font,size=25)

#设置Y刻度
plt.yticks(range(0,50,5),["%d"%x for x in range(0,50,5)],fontproperties=font1,size=20)

# 只保留图形信息
plt.show()

Matplotlib绘制条形图的方法你知道吗

二、横向条形图

横向条形图需要使用barh()这个跟bar非常的类似,只不过把方向进行旋转。参数也和pyplot.bar()类似

matplotlib.pyplot.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)
# 主要参数解释:
# y:数组或列表,代表需要绘制的条形图在y轴上的坐标点。
# width:数组或列表,代表需要绘制的条形图在x轴上的值(也就是长度)。
# height:条形图的高度(宽度),默认是0.8。
# left:条形图的基线,也就是距离y轴的距离。默认为0

示例:

plt.barh()

movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}
font2 = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')
x1 = list(movies.keys())
y1 = list(movies.values())

# 设置图的大小
plt.figure(figsize=(10,5))

# 使用plt.barh()
plt.barh(x1,y1,height=0.7,left=0,color='c',edgecolor='r')

#设置Y轴刻度,设置字体,也可以设置字体大小size
plt.yticks(fontproperties=font2,size=20)

plt.xlabel("票房/亿",size=20)

# 设置标题
plt.title("电影票房数据",size=30)

# 只保留图形信息
plt.show()

Matplotlib绘制条形图的方法你知道吗

Axes.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)

另外,还可通过返回的axes对象绘制图形

movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}

font2 = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')
mdf = pd.DataFrame(data={"name":list(movies.keys()),"tickes":list(movies.values())})

fig,axes = plt.subplots()  

# 通过返回的axes对象绘制图形
axes.barh("name","tickes",data = mdf,height=0.6,left=0,color='c',edgecolor='r')

#设置Y轴刻度,设置字体,也可以设置字体大小size
plt.yticks(fontproperties=font2,size=20)

plt.xlabel("票房/亿",size=24)

# 设置标题
plt.title("电影票房数据",size=27)

# 只保留图形信息
plt.show()

Matplotlib绘制条形图的方法你知道吗

三、分组条形图的绘制

五天的电影票房数据(假设日期为1.1-1.5):并转换为DataFrame索引

movies = {
    "流浪地球":[2.01,4.59,7.99,11.83,16],
    "飞驰人生":[3.19,5.08,6.73,8.10,9.35],
    "疯狂的外星人":[4.07,6.92,9.30,11.29,13.03],
    "新喜剧之王":[2.72,3.79,4.45,4.83,5.11],
    "廉政风云":[0.56,0.74,0.83,0.88,0.92],
    "神探蒲松龄":[0.66,0.95,1.10,1.17,1.23],
    "小猪佩奇过大年":[0.58,0.81,0.94,1.01,1.07],
    "熊出没·原始时代":[1.13,1.96,2.73,3.42,4.05]
}
mdf = pd.DataFrame(movies)  
mdf

Matplotlib绘制条形图的方法你知道吗

绘制分组条形图思路:先选出每天所有电影的票房数据,可使用DataFrame.iloc[]方法获取,例如

# 获取第一天票房数据
mdf.iloc[0]
流浪地球        2.01
飞驰人生        3.19
疯狂的外星人      4.07
新喜剧之王       2.72
廉政风云        0.56
神探蒲松龄       0.66
小猪佩奇过大年     0.58
熊出没·原始时代    1.13
Name: 0, dtype: float64

然后按天进行绘制,这里需要确定一个中心点作为中间日期的条形图位置(这里为第三天),有多少部电影就需要多少个中心点,可使用np.arange(len(movies))获取x轴刻度作为中心点。最后根据日期按条形图的宽度调整条形图位置即可。

plt.figure(figsize=(15,5))
# 设置X轴刻度为一个数组(有广播功能)
xticks = np.arange(len(movies)) 

#设置字体
font = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')

# 设置条形图宽度
bar_width = 0.15

#设置第一天所有影片条形图的位置
plt.bar(xticks-2*bar_width,mdf.iloc[0],width=bar_width,color='pink') # iloc[]取DataFrame的一行
#设置第二天所有影片条形图的位置 
plt.bar(xticks-bar_width,mdf.iloc[1],width=bar_width)
#设置第三天所有影片条形图的位置,默认在[0 1 2 3 4 5 6 7]center处
plt.bar(xticks,mdf.iloc[2],width=bar_width)
#设置第四天所有影片条形图的位置
plt.bar(xticks+bar_width,mdf.iloc[3],width=bar_width)
#设置第五天所有影片条形图的位置
plt.bar(xticks+2*bar_width,mdf.iloc[4],width=bar_width)

# 设置X轴信息
plt.xticks(xticks,mdf.columns,fontproperties=font,size=15)
#设置Y刻度
plt.yticks(range(0,20,2),["%d"%x for x in range(0,20,2)],fontproperties=font,size=16)

#设置X,Y轴名字
plt.ylabel('票房/亿',fontproperties=font,size=30)
plt.xlabel('影片名字',fontproperties=font,size=30)

# 设置标题
plt.title("五日票房数据",fontproperties=font,size=30)

# 只保留图形信息
plt.show()

Matplotlib绘制条形图的方法你知道吗

使用循环绘制每日数据

plt.figure(figsize=(16,5))
# 设置X轴刻度为一个数组(有广播功能)
#xticks1 = np.arange(len(movies)) # 这样设置每部电影X轴的距离是1,如果5个条形图宽度之后大于1会和其他电影重叠,可以设置步长
xticks1 = np.arange(0,7*len(movies),7) # 改变步长,要在设置X轴信息处改变xticks(步长*ticks labels)的第一个参数,否则对应不上

#设置字体
font4 = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF')

# 设置条形图宽度
bar_width1 = 1.05

#使用循环画出前五天的条形图
for index in mdf.index:
   # plt.bar(xticks1+(-2+index)*bar_width1,mdf.iloc[index],width=bar_width1,label='第%d天票房'%(index+1))
    xs = xticks1+(-2+index)*bar_width1 # 在X轴的位置
    day_tickets = mdf.iloc[index]
    plt.bar(xs,day_tickets,width=bar_width*7,label="第%d天票房"%(index+1))
    #设置注释文本
    # zip(day_tickets,xs)打包为元素为元组的列表,元素个数与最短的列表一致
    for ticket,x in zip(day_tickets,xs):   # ticket是day_tickets列表的值,x是xs的值
        plt.annotate(ticket,xy=(x,ticket),xytext=(x-0.2,ticket+0.1))


# 设置X轴信息
plt.xticks(7*xticks,mdf.columns,fontproperties=font4,size=15)

#设置X,Y轴名字
plt.ylabel('票房/亿',fontproperties=font4,size=25)
plt.xlabel('影片名字',fontproperties=font4,size=25)

# 设置标题
plt.title("五日票房数据",fontproperties=font4,size=30)

# 设置图例
font4.set_size(15) # 图例无size属性,可以在字体设置font4中改大小(或者font.set_size():只改图例
plt.legend(prop=font4)  # 根据bar()函数的中的label标签进行设置,不可缺少

# 设置网格
plt.grid()

# 只保留图形信息
plt.show()

Matplotlib绘制条形图的方法你知道吗

四、堆叠条形图绘制

堆叠条形图就是在已有数据基础位置上进行绘制图形,使用bottom参数,以已有数据作为新数据的基地进行新数据的绘制,可以达到调整条形图的位置的目的。

示例:

# 男女不同组别的等分情况
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
groupNames = ('G1','G2','G3','G4','G5')

xs = np.arange(len(menMeans))  # 有多少个组

font5 = font_manager.FontProperties(fname='C:\Windows\Fonts\STSONG.TTF',size=16)

plt.figure(figsize=(15,7))

# 绘制男性得分
plt.bar(xs,menMeans,label='男性得分',width=0.4)

# 绘制女性得分,以男性得分的最大值为基底
plt.bar(xs,womenMeans,bottom=menMeans,label='女性得分',width=0.4)

#设置图例
plt.legend(prop=font5)  # 根据bar()函数的中的label标签进行设置

# 设置X轴刻度名称
plt.xticks(xs,groupNames)

# 设置标签
plt.xlabel("组别",fontproperties=font5,size=23)
plt.ylabel("得分",fontproperties=font5,size=23)

# 设置标题
plt.title("男女不同组别得分",fontproperties=font5,size=28)

# 只保留图形
plt.show()

Matplotlib绘制条形图的方法你知道吗

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注三水点靠木的更多内容! 

Python 相关文章推荐
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 Python
Python自定义一个类实现字典dict功能的方法
Jan 19 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
python实现简单聊天室功能 可以私聊
Jul 12 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
Oct 24 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 Python
python 获取当前目录下的文件目录和文件名实例代码详解
Mar 10 Python
python3安装OCR识别库tesserocr过程图解
Apr 02 Python
详解python中groupby函数通俗易懂
May 14 Python
python字符串的index和find的区别详解
Jun 20 Python
Python requests模块安装及使用教程图解
Jun 30 Python
实例代码讲解Python 线程池
Aug 24 Python
Python的代理类实现,控制访问和修改属性的权限你都了解吗
Mar 21 #Python
python的netCDF4批量处理NC格式文件的操作方法
Python&Matlab实现灰狼优化算法的示例代码
Python学习之时间包使用教程详解
Mar 21 #Python
Python数据结构之队列详解
Python学习之os包使用教程详解
分享几种python 变量合并方法
Mar 20 #Python
You might like
PHP的FTP学习(一)
2006/10/09 PHP
PHP连接局域网MYSQL数据库的简单实例
2013/08/26 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
PHP处理会话函数大总结
2015/08/05 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
Maps Javascript
2007/01/22 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
2015/08/21 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
基于javascript的无缝滚动动画实现2
2020/08/07 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
Python中map,reduce,filter和sorted函数的使用方法
2015/08/17 Python
详解Python读取配置文件模块ConfigParser
2017/05/11 Python
Python面向对象编程基础解析(二)
2017/10/26 Python
关于Python数据结构中字典的心得
2017/12/04 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
对pandas写入读取h5文件的方法详解
2018/12/28 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
pytorch中index_select()的用法详解
2021/01/06 Python
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
校园餐饮创业计划书
2014/01/10 职场文书
自动化专业职业生涯规划书范文
2014/01/16 职场文书
母亲节演讲稿
2014/05/27 职场文书
2014基建处领导班子“四风”对照检查材料思想汇报
2014/10/04 职场文书
2014年创卫工作总结
2014/11/24 职场文书
读《瓦尔登湖》有感:每个人都需要一个瓦尔登湖
2019/10/17 职场文书
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
2021/08/23 HTML / CSS
CSS基础详解
2021/10/16 HTML / CSS