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

目录
  • 一、一般条形图
    • 示例:
  • 二、横向条形图
    • 示例:
  • 三、分组条形图的绘制
  • 四、堆叠条形图绘制
    • 示例:
  • 总结
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()

也可以利用字典创建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()

二、横向条形图

横向条形图需要使用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()

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

三、分组条形图的绘制

五天的电影票房数据(假设日期为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

绘制分组条形图思路:先选出每天所有电影的票房数据,可使用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()

使用循环绘制每日数据

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

四、堆叠条形图绘制

堆叠条形图就是在已有数据基础位置上进行绘制图形,使用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()

总结

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

(0)

相关推荐

  • python matplotlib库绘制条形图练习题

    练习一:假设你获取到了2017年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据? a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5:最后的骑士","摔跤吧!爸爸","加勒比海盗5:死无对证","金刚:骷髅岛","极限特工:终极回归","生化危机

  • python3使用matplotlib绘制条形图

    本文实例为大家分享了python3使用matplotlib绘制条形图的具体代码,供大家参考,具体内容如下 绘制竖状条形图 代码 from matplotlib import pyplot as plt from matplotlib import font_manager my_font = font_manager.FontProperties(fname="/usr/share/fonts/truetype/arphic/ukai.ttc") a = ["战狼2"

  • python使用Matplotlib画条形图

    本文实例为大家分享了python使用Matplotlib画条形图的具体代码,供大家参考,具体内容如下 数据 中国的四个直辖市分别为北京市.上海市.天津市和重庆市,其2017年上半年的GDP分别为12406.8亿.13908.57亿.9386.87亿.9143.64亿. 代码 # encoding:utf-8 import matplotlib.pyplot as plt # 构建数据 GDP = [12406.8,13908.57,9386.87,9143.64] # 中文乱码的处理 plt.r

  • Python Matplotlib条形图之垂直条形图和水平条形图详解

    目录 1.垂直条形图 2.水平条形图 总结 条形图是一种常用的图形,比如在各种PPT的展示中为各种职业人士所喜爱.条形图能够直观地展示各种场景下数值的比较.Matplotlib提供了bar()函数绘制条形图. 这里提供一个案例: 假设某销售公司需要在PPT中展示4位员工的年度销售业绩,用条形图绘制小红.小王.小李.小张的业绩,分别是260万元.300万元.310万元.269万元. 在图中标注一些中文信息,Matplotlib本身对中文的支持不是很友好,在绘图前使用如下代码进行设置,可以解决该问题

  • Matplotlib条形图之分组条形图和堆叠条形图详解

    目录 分组条形图 堆叠条形图 总结 分组条形图 拓展一下问题复杂度:使用水平条形图展示每位员工前三个月的销售额.此时,我们需要将每位员工的销售额按月分组,分别绘制条形图进行展示. import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示

  • Python Matplotlib绘制条形图的全过程

    目录 条形图 单组条形图 水平条形图 多组条形图 堆积条形图 对称条形图 总结 条形图 条形图具有丰富的表现形式,常见的类型包括单组条形图,多组条形图,堆积条形图和对称条形图等. 单组条形图 条形图的每种表现形式都可以绘制成垂直条形图或水平条形图,以单组条形图的两种绘制方式为例. 垂直条形图 import matplotlib.pyplot as plt data = [10., 20., 5., 15.] plt.bar(range(len(data)), data) plt.show() T

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

    目录 一.一般条形图 示例: 二.横向条形图 示例: 三.分组条形图的绘制 四.堆叠条形图绘制 示例: 总结 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, b

  • 如何使用Python Matplotlib绘制条形图

    目录 前言 一.一般条形图 二.横向条形图 三.分组条形图的绘制 四.堆叠条形图绘制 总结 前言 matplotlib是一个非常强大的Python第三方绘图包,可以绘制非常多非常漂亮的图形. import numpy as np import pandas as pd import matplotlib.pyplot as plt from matplotlib import font_manager 一.一般条形图 一般条形图使用 pyplot.bar()函数绘制,其形式及参数如下: matp

  • Python使用matplotlib绘制动画的方法

    本文实例讲述了Python使用matplotlib绘制动画的方法.分享给大家供大家参考.具体分析如下: matplotlib从1.1.0版本以后就开始支持绘制动画 下面是几个的示例: 第一个例子使用generator,每隔两秒,就运行函数data_gen: # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation fig =

  • Python实现在tkinter中使用matplotlib绘制图形的方法示例

    本文实例讲述了Python实现在tkinter中使用matplotlib绘制图形的方法.分享给大家供大家参考,具体如下: 一. 代码: # coding=utf-8 import sys import Tkinter as Tk import matplotlib from numpy import arange, sin, pi from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2T

  • Python+matplotlib绘制条形图和直方图

    目录 摘要 一.bar()函数 二,hist()函数 三.数据统计 摘要 先介绍条形图直方图,然后用随机数生成一系列数据,保存到列表中,最后统计出相关随机数据的概率并展示 前述介绍了由点进行划线形成的拆线图和散点形成的曲线图,连点成线,主要用到了matplotlib中的plot()和scatter()这个函数,但在实际生活工作中,不仅有折线图,还经常会出现月份经济数据对比图,身高统计图等,制成图表就很容易对比看出差异. 下面用matplotlib中bar()函数和hist()来实现条形图和直方图

  • python多次绘制条形图的方法

    本文实例为大家分享了python绘制直方图的具体代码,供大家参考,具体内容如下 运行结果如下 代码如下 from matplotlib import pyplot as plt if __name__ == "__main__":     a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5",          "摔跤吧!爸爸",&qu

  • python+matplotlib绘制3D条形图实例代码

    本文分享的实例主要实现的是Python+matplotlib绘制一个有阴影和没有阴影的3D条形图,具体如下. 首先看看演示效果: 完整代码如下: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # setup the figure and axes fig = plt.figure(figsize=(8, 3)) ax1 = fig.add_subplot(121

  • python利用matplotlib库绘制饼图的方法示例

    介绍 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并且 Gallery页面 中有上百幅缩略图,打开之后都有源程序.因此如果你需要绘制某种类型的图,只需要在这个页面中浏览/复制/粘贴一下,基本上都能搞定. matplotlib的安装方法可以点击这里 这篇文章给大家主要介绍了python用matplotlib绘制饼图的方法,话不多说,下面来看代码

随机推荐