七、Matplotlib库(中)

一、条形图

条形图的绘制方式跟折线图非常的类似,只不过是换成了plt.bar 方法。plt.bar 方法有以下常用参数:

  1. x:一个数组或者列表,代表需要绘制的条形图的x轴的坐标点。
  2. height:一个数组或者列表,代表需要绘制的条形图y轴的坐标点。
  3. width:每一个条形图的宽度,默认是0.8的宽度。
  4. bottom:y轴的基线,默认是0,也就是距离底部为0.
  5. align:对齐方式,默认是center,也就是跟指定的x坐标居中对齐,还有为edge,靠边对齐,具体靠右边还是靠左边,看width的正负。
  6. color:条形图的颜色。
    返回值为 BarContainer,是一个存储了条形图的容器,而条形图实际上的类型是matplotlib.patches.Rectangle对象。

更多参考:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.bar.html#matplotlib.pyplot.bar

1.1 条形图的绘制

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from matplotlib import font_manager
font = font_manager.FontProperties(fname="C:\Windows\Fonts\msyh.ttc")
#票房单位亿元
movies = {
   
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}
plt.figure(figsize=(15,5))
plt.bar(np.arange(len(movies)),list(movies.values()),width=0.5)
plt.xticks(np.arange(len(movies)),list(movies.keys()),fontproperties=font)
plt.yticks(np.arange(0,45,5),[f'{
     v}亿'for v in range(0,45,5)],fontproperties=font)
plt.grid()
plt.show()

在这里插入图片描述

1.2 横向条形图的绘制

横向条形图需要使用 plt.barh 这个方法跟 bar 非常的类似,只不过把方向进行旋转。参数跟bar类似,但也有区别。如下:

  1. y:数组或列表,代表需要绘制的条形图在 y 轴上的坐标点。
  2. width:数组或列表,代表需要绘制的条形图在x轴上的值(也就是长度)。
  3. height:条形图的高度,默认是0.8。
  4. left:条形图的基线,也就是距离y轴的距离。
    其他参数跟 bar 一样。
    返回值也是 BarContainer 容器对象
movies = {
   
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}
plt.barh(np.arange(len(movies)),list(movies.values()))
plt.xticks(np.arange(0,45,5),[f'{
     v}亿' for v in range(0,45,5)],fontproperties=font)
plt.yticks(np.arange(len(movies)),list(movies.keys()),fontproperties=font)
plt.grid()
plt.show()

在这里插入图片描述

1.3 分组条形图

matplotlib没有直接实现分组条形图的方法,需要借用plt.bar来实现

# 现在有一组数据,是2019年春节贺岁片前五天的电影票房记录。
# 示例代码如下:
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]
}
# 构建DataFrame数据
movie_pd = pd.DataFrame(movies)
print(movie_pd)
    流浪地球  飞驰人生  疯狂的外星人  新喜剧之王  廉政风云  神探蒲松龄  小猪佩奇过大年  熊出没·原始时代
0   2.01  3.19    4.07   2.72  0.56   0.66     0.58      1.13
1   4.59  5.08    6.92   3.79  0.74   0.95     0.81      1.96
2   7.99  6.73    9.30   4.45  0.83   1.10     0.94      2.73
3  11.83  8.10   11.29   4.83  0.88   1.17     1.01      3.42
4  16.00  9.35   13.03   5.11  0.92   1.23     1.07      4.05

# 第一种方案
# first_day = movie_pd.iloc[0]
# plt.bar(ind-bin_width*2,first_day,width=bin_width,label='第一天')

# second_day = movie_pd.iloc[1]
# plt.bar(ind-bin_width,second_day,width=bin_width,label='第二天')

# third_day = movie_pd.iloc[2]
# plt.bar(ind,third_day,width=bin_width,label='第三天')

# four_day = movie_pd.iloc[3]
# plt.bar(ind+bin_width,four_day,width=bin_width,label='第四天')

# five_day = movie_pd.iloc[4]
# plt.bar(ind+bin_width*2,five_day,width=bin_width,label='第五天')

plt.figure(figsize=(20,8))
width = 0.8
bin_width = width/len(movie_pd.index)
ind = np.arange(0,len(movies))


# 第二种方案
for index in movie_pd.index:
    day_tickets = movie_pd.iloc[index]
    xs = ind-(bin_width*(len(movie_pd.index)//2-index))
    plt.bar(xs,day_tickets,width=bin_width,label="第%d天"%(index+1))
    for ticket,x in zip(day_tickets,xs):
        plt.annotate(ticket,xy=(x,ticket),xytext=(x-0.1,tick
  • 18
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ModelBulider

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值