Python 数据可视化:绘制柱形图和条形图

您所在的位置:网站首页 条形图包括什么内容和内容组成 Python 数据可视化:绘制柱形图和条形图

Python 数据可视化:绘制柱形图和条形图

2024-07-16 16:25:49| 来源: 网络整理| 查看: 265

从本课开始,依次介绍常用的一些统计图表,以下引用来自维基百科中的“统计图表”词条部分内容。

图表(Chart),或又称为统计图表,代表了一张图像化的数据,并经常以所用的图像命名,例如圆饼图,是主要使用圆形符号,长条图或直方图,则主要使用长方形符号。折线图,意味着使用线条符号。

常见的图表包括:直方图(Histogram)、长条图(Bar Chart)、饼图(Pie Chart)、折线图(Line Chart)等。

1.5.1 柱形图

柱形图,还称为长条图、条图、条状图、棒形圖、柱状图,长条图,英文中可以使用“bar graph”或者“bar chart”。

柱形图基本样式如下图所示,它是一种以柱子高度为变量的统计图表。在柱形图中可以直观地观察到某些变量之间的相对大小关系。通常,柱形图适用于较小的数据集,如果数据集的维度太多,会造成“柱子”太密集,失去了可视化的效果。

%matplotlib inline import numpy as np import pandas as pd import matplotlib.pyplot as plt position = ['apple', 'facebook', 'google', 'huawei', 'alibaba'] data = [56, 65, 98, 73, 86] plt.bar(x=position, height=data)

输出结果:

enter image description here

绘制柱形图所使用的函数为 plt.bar,其完整形式如下:

plt.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)

下面对若干常用参数进行解释:

x,坐标系的横坐标 height,柱子的高度 width,柱子的宽度 bottom,柱子底部与 x 轴之间的距离 align,可选值为 'center' 或 'edge',设置 x 轴横坐标的主刻线与柱子的中央对齐,还是与边缘对齐 color,柱子的颜色 edgecolor,柱子边缘的颜色 linewidth,柱子边线的宽度,如果为 0,则没有边线 tick_label,横坐标刻线的标示,如果不设置,则默认为数字

再使用 plt.bar 制图,加深对某些参数的理解,特别注意观察参数的值和输出结果,并与上面的输出结果对比。

plt.bar(x=position, height=data, width=0.4, bottom=[10,7,0,5,3], color='red', linewidth=5) plt.grid(True)

输出结果:

image

除了使用 plt.bar 之外,前面曾经提过,在 pandas 的 DataFrame 对象下,有专门绘图的方法,柱形图就可以这样来实现。

df = pd.DataFrame({"position":position, 'data':data}) df.plot.bar(x='position', y='data')

输出结果:

enter image description here

上述柱形图比较的是单个变量(维度、特征)之间的大小关系,在此基础上,还可以用一种称为“堆积柱形图”的方式,展示每个变量(维度、特征)内部的各元素比例。

下面看一个示例,是对近年全国暑期票房收入的统计(仅统计历年 8 月份),借此理解“堆积柱形图”的绘制和应用。

首先本例所用数据来自 Tushare,如果读者愿意使用第三方模块获得数据,请安装:pip3 install Tushare,然后按照如下演示得到数据。但是,这个模块的官方在读者阅读的时候或许已经修改了读取数据的政策,若用下面的方式没有得到数据,请到官方网站查阅最新政策。另外,为了方便学习,我把以下示例用到的数据整理到了数据仓库,可以将此数据下载到本地,然后用pd.read_csv函数加载。

import tushare as ts box_office = pd.DataFrame() for y in range(2010, 2019): # 2010年(含)至2018年(含) ym = str(y) + '-8' df = ts.month_boxoffice(ym) box_office[ym] = df['boxoffice'] box_office # output 2010-8 2011-8 2012-8 2013-8 2014-8 2015-8 2016-8 2017-8 2018-8 0 26918 39162 27993 63665 39313 73427 98811 424006 132009 1 17760 30890 23051 29567 36338 54977 58144 53419 122078 2 8816 22919 15020 29460 28981 48912 38770 49087 102581 3 8125 17219 14636 17121 20807 20948 38675 34147 68285 4 5157 6243 13518 16468 18746 19542 34589 29012 55460 5 5133 5326 8895 14473 18714 18083 26931 23652 32013 6 3980 3594 7037 11416 16926 17220 16663 16825 23011 7 2655 3410 6868 7542 9770 14643 15334 15806 19543 8 2581 3301 4159 6286 9729 14458 14736 12588 17830 9 2233 1954 3471 5440 9464 9977 8376 11341 15238 10 8245 13137 17216 24674 53426 69576 54576 66712 93990

然后计算每年的票房总收入。

box_office = box_office.astype(np.int) # 将数据类型转化为整数型 total = box_office.sum() total # output 2010-8 91603 2011-8 147155 2012-8 141864 2013-8 226112 2014-8 262214 2015-8 361763 2016-8 405605 2017-8 736595 2018-8 682038 dtype: int64

接下来才是激动人心的时刻,先贴出代码和结果,再慢慢品味。

import matplotlib.ticker as ticker first = box_office.iloc[0].astype(np.int) # 历年票房第一 after_first = total - first # 其他影片票房收入 date_index = pd.to_datetime(total.index) fig, ax = plt.subplots() ax.grid(color='gray') ax.bar(range(1, 10), after_first.values, label='others') # ① ax.bar(range(1, 10), first.values, bottom=after_first.values, label='first') # ② ax.set_xticks(range(0, 10)) # ③ ax.xaxis.set_major_formatter(ticker.IndexFormatter([0]+date_index.year.tolist())) # ④ plt.legend(loc=0)

输出结果:

image

先观察输出结果的图示,从中都可以读出什么信息?

基本上票房收入在一直增加,2017 年 8 月份是历年 8 月份的最高峰,2018 年则略有下降。 再看每年票房收入第一的影片在当年总收入中所占比重,显然 2017 年的是凸点,这年影片票房收入的头部效应非常显著,而其他影片的票房收入相比上一年并没有太多增加。

2017 年票房第一的就是那部高扬民族主义大旗的动作片《战狼2》,据娱乐新闻报道后来也得补税。

看电影的时候热血沸腾,但研究科学问题,还是要静下心来。“科学技术是第一生产力”,再鼓舞士气的电影,也不如扎扎实实的生产力发展。因此,建议读者,还是要认真研究程序中的每个语句,这才是真正民族崛起的保证。

① 和 ② 两个语句,是在坐标系中绘制柱形图,它们的差别在于 ① 中没有设置 bottom 参数,② 中有 bottom = after_first.values,从而实现票房收入第一的和当年其他影片收入成为“堆积柱”,两者的总高度是该年的总票房收入。

注意,语句 ③ 和 ④ 是用来设置横坐标的主刻线以及相应的标示,特别是在 ④ 中,使用了 matplotlib.ticker 中的 IndexFormatter 类得到标示对象。

堆积柱形图可以看做是柱形图的拓展,此外,还有被称为“簇状柱形图”的拓展,即将若干个柱形图作为一簇,在每一簇中,柱子和柱子之间的距离小于簇与簇之间的距离,通常将簇内各柱子之间距离设置为 0。

position = np.arange(1, 6) a = np.random.random(5) b = np.random.random(5) total_width = 0.8 n = 2 width = total_width / n position = position - (total_width - width) / n # ⑤ plt.bar(position, a, width=width, label='a', color='b') # ⑥ plt.bar(position + width, b, width=width, label='b', color='r') # ⑦ plt.legend(loc=0)

输出结果:

image

语句 ⑤ 计算除了每簇的中央位置,这个很重要,请揣摩一下它的数学表达式含义。

语句 ⑥ 和 ⑦ 分别绘制每簇中的两个柱子,因为每簇中柱子之间的距离是 0,所以在 ⑦ 中用 position + width 表示第二根柱子的中央线位置。

对于绘制“簇状柱形图”,如果直接使用 DataFrame 对象的方法,可以更简单。例如:

speed = [0.1, 17.5, 40, 48, 52, 69, 88] lifespan = [2, 8, 70, 1.5, 25, 12, 28] index = ['snail', 'pig', 'elephant', 'rabbit', 'giraffe', 'coyote', 'horse'] df = pd.DataFrame({'speed': speed,'lifespan': lifespan}, index=index) ax = df.plot.bar(rot=0)


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭