关键词搜索

源码搜索 ×
×

动态图表很炫酷,但自己不会,python视化库Pandas_Alive带你实现

发布2022-05-04浏览479次

详情内容

前言

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

  • x:一个数组或者列表,代表需要绘制的条形图的x轴的坐标点。
  • height:一个数组或者列表,代表需要绘制的条形图y轴的坐标点。
  • width:每一个条形图的宽度,默认是0.8的宽度。
  • bottom:y轴的基线,默认是0,也就是距离底部为0.
  • align:对齐方式,默认是center,也就是跟指定的x坐标居中对齐,还有为edge,靠边对齐,具体靠右边还是靠左边,看width的正负。
  • color:条形图的颜色。

返回值为BarContainer,是一个存储了条形图的容器,而条形图实际上的类型是matplotlib.patches.Rectangle对象。

横向条形图:

横向条形图需要使用plt.barh这个方法跟bar非常的类似,只不过把方向进行旋转。

参数跟bar类似,但也有区别。如下:

  • y:数组或列表,代表需要绘制的条形图在y轴上的坐标点。
  • width:数组或列表,代表需要绘制的条形图在x轴上的值(也就是长度)。
  • height:条形图的高度,默认是0.8。
  • left:条形图的基线,也就是距离y轴的距离。
  • 其他参数跟bar一样。

返回值也是BarContainer容器对象。

还是以以上数据为例,将电影名和票房反转一下。

示例代码如下:

movies = {
# 更多资源、源码、解答可加:832157862
    "流浪地球":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.yticks(np.arange(len(movies)),list(movies.keys()),fontproperties=font)
plt.grid()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

效果图如下:

image.png

条形图的绘制:

比如现在有2019年贺岁片票房的数据(数据来源:https://piaofang.maoyan.com/dashboard)

#票房单位亿元
movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

用条形图绘制每部电影及其票房的代码如下:

movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
# 更多资源、源码、解答可加:832157862
}
plt.bar(np.arange(len(movies)),list(movies.keys()))
plt.xticks(np.arange(len(movies)),list(movies.keys()),fontproperties=font)
plt.grid()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

效果图如下:image.png

其中xticks和yticks的用法跟之前的折线图一样。

这里新出现的方法是bar,bar常用的有3个参数,分别是x(x轴的坐标点),y(y轴的坐标点)以及width(条形的宽度)。

分组条形图:

现在有一组数据,是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]
}
plt.figure(figsize=(20,8))
width = 0.75
bin_width = width/5
movie_pd = pd.DataFrame(movies)
ind = np.arange(0,len(movies))
 
# 第一种方案
# 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='第五天')

# 更多资源、源码、解答可加:832157862 
# 第二种方案
for index in movie_pd.index:
    day_tickets = movie_pd.iloc[index]
    xs = ind-(bin_width*(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,ticket+0.1))
 
# 设置图例
plt.legend(prop=font)
plt.ylabel("单位:亿",fontproperties=font)
plt.title("春节前5天电影票房记录",fontproperties=font)
# 设置x轴的坐标
plt.xticks(ind,movie_pd.columns,fontproperties=font)
plt.xlim
plt.grid(True)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

示例图如下:

image.png

堆叠条形图:

堆叠条形图,是将一组相关的条形图堆叠在一起进行比较的条形图。

比如以下案例:

menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
groupNames = ('G1','G2','G3','G4','G5')
xs = np.arange(len(menMeans))
plt.bar(xs,menMeans)
plt.bar(xs,womenMeans,bottom=menMeans)
plt.xticks(xs,groupNames)
plt.show()
# 更多资源、源码、解答可加:832157862
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

效果图如下:

image.png

在绘制女性得分的条形图的时候,因为要堆叠在男性得分的条形图上,所以使用到了一个bottom参数,就是距离x轴的距离。

通过对贴条形图,我们就可以清楚的知道,哪一个队伍的综合排名是最高的,并且在每个队伍中男女的得分情况。

条形图应用场景:

  1. 数量统计。
  2. 频率统计。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载