echarts柱状图,一根柱子如何展示两个数据?

2021-03-19 10:12发布

[图]只会显示一个数据,请问如何放另一个数据上去呢(浅蓝色部分能显示两个数据)?

图片说明
只会显示一个数据,请问如何放另一个数据上去呢(浅蓝色部分能显示两个数据)?

1条回答
我是大脸猫
2楼 · 2021-03-21 21:27

绘制上图的代码如下:Matplotlib 初识


Matplotlib 是 Python 中常用的 2D 绘图库,它能轻松地将数据进行可视化,作出精美的图表。


小贴士:matplotlib 也是第三方模块,本地环境需要使用pip install matplotlib进行安装。


Matplotlib 这个模块很庞大,最常用的是其中一个子模块——pyplot,通常这样导入它:



因为后面经常用到matplotlib.pyplot,因此给它起了个别名plt以减少大量重复代码。


pyplot中最基础的作图方式是以点作图,即给出每个点的坐标,pyplot会将这些点在坐标系中画出,并用线将这些点连起来。我们以正弦函数为例,看看如何用pyplot画出它的函数图像:



上面代码画出了一个周期的正弦函数图像,结果如下:



接下来我们逐行看看每行代码的作用,首先是x = np.arange(0, 2 * np.pi, 0.1)。np.arange()方法我们上一关中学过,np.pi就是 π 的值。所以这行代码的作用是:生成一个从 0 到 2π 的数组,步长是 0.1。我们可以将x打印出来看看:



这样我们就获得了 x 轴的所有坐标。步长为 0.1 是为了让每个点间隔小一点,点的数量多一点。这样画出的图像更加接近真实情况,也更加的平滑。如果步长是 1 的话,我们的图像将会变成这样:



接下来是y = np.sin(x)。np.sin()方法是 numpy 中计算正弦函数的方法,我们将x的值传进去就得到对应的正弦值。我们也将y的值打印出来看看:



小贴士:除了np.sin()方法之外,numpy 中也有np.cos()、np.tan()等计算三角函数的方法。


有了 x 和 y 的值之后,将其分别传入 plt.plot() 方法,pyplot 会将其转换成对应的坐标。上述例子中,(0, 0) 是第一个坐标,(0.1, 0.09983342) 是第二个坐标,(6.2, -0.0830894) 是最后一个坐标。


将这些坐标连成线就得到了函数的图像,最后调用 plt.show() 方法就能将图像显示出来了。


上面这些方法中,最重要的是plt.plot()方法。plt.plot()方法接收任意对数的x和y,它会将这些图像在一张图上都画出来。比如你想再画一个余弦函数的图像,可以这样写:



上面代码共用了同一个x,实际上你可以重新定义x的范围,最后得到的图像如下:



还有一种画多个图像的方法是:每对x和y都调用一次plt.plot()方法。因此,下面的代码和上面的代码是等价的:



其实对于每一对x和y,还有一个可选的格式化参数,用来指定线条的颜色、点标记和线条的类型。



传入了格式化参数后,之前的图像变成了下面这样:



你肯定不明白为什么会变成这样,且听我给你慢慢说来。以'ro--'为例,它分为 3 部分:r代表红色(red),o代表的是圆点标记,--代表着虚线。ro--的意思就是线条为红色虚线、坐标点标记为圆点。


格式化参数的这 3 部分都是可选的,也没有顺序要求。你可以只传入一个'r'来指定颜色,也可以写成--or。格式化参数的每部分都有很多选项,因此能形成很多组合,下图列出了格式化参数常用的选项及其含义:



小贴士:代表颜色的字母都是对应英文单词的首字母,黑色除外,因为黑色和蓝色首字母都是 b,因此黑色用尾字母 k 表示。


数据展示是一种分析方法


既然我们通过数据分析来进行决策,那么使用合适的图表来准确地展示数据是至关重要的。


要做到这一点,首先你要理解每种图表的表达方式及其适用场景。然后,根据要分析的目标选择合适的图表类型。


除了折线图、柱状图、饼图等我们习以为常的图表类型,还有很多实用的图表类型。所以在绘制图表之前,我们先来了解各种图表类型的适用场景。


实际使用中,我们会用到各种各样的几十种图表。按照数据展示的目标可以把它们分为五种,分别是:趋势、比较、构成、分布和联系。



我们来一起看看上面这五种类型的区别:


趋势:这是最常见的一种时间序列关系,关心数据如何随着时间变化,趋势类里的图表能直观反映出每年、每月、每天的变化趋势,增长、减少、上下波动还是基本不变。最常见的是折线图,它能很好地表现指标随时间呈现的趋势。


构成:主要关注每个部分占整体的比例,如果你想分析的目标诸如“份额”、“百分比”等。展示构成关系的图表类型里,最常见的就是饼图。


比较:可以展示某个维度上的排列顺序,分析某维度之间的对比是差不多,还是 “大于”、“小于”,比如分析男生和女生的身高差别。


分布:当你关心数据集中、频率、分布时,比如根据地理位置数据,通过地图来展示不同分布特征。比较常用的图表有地图、直方图、散点图。


联系:主要查看两个变量之间是否表达出我们预期所要证明的相关关系。比如预期销售额可能随着优惠折扣的增长而增长,常用于表达“与……有关”、“随……而增长”、“随……而不同”等维度间的关系。


图表的类型多种多样,在可视化的海洋中,每一种图表都有其存在的意义,其特点和应用也都不尽相同。


在进行数据可视化时,要先明确分析的目标,再来选择五种分类的适合分类,最后选择某个分类里面合适的图表类型。我们要努力让图表更容易被解读,清晰地看到数据背后隐藏的奥秘!


绘制折线图


其实你已经掌握了折线图的基本画法,就是使用plt.plot()方法。之前我们传入的x和y是坐标点,而画折线图时的x和y分别是时间点和对应的数据。举个例子:




上面是某商品一周的销量走势。x 轴传入时间,y 轴传入对应的销量,应该不难理解。因为图中有中文,所以需要通过plt.rcParams['font.family'] = ['Noto Sans CJK JP']来设置中文字体,否则中文将会乱码。


Noto Sans CJK JP是教学环境中安装的中文字体,在你的本地环境不一定适用,你可以通过如下代码打印出已经安装的字体,找到其中的中文字体名称替换掉Noto Sans CJK JP即可,例如SimHei(黑体)等。



我也可以将多个商品的销量走势画在一张图上进行对比,只需调用两次 plt.plot() 方法即可。




这样我们就得到了两条折线。不知道你有没有发现,上图是有问题的。我们并不能从图中得知哪一个是商品 A,哪一个是商品 B,因此我们还要给它加上图例。


加图例很简单,只要在调用 plt.plot() 方法时传入 label 参数,接着调用 plt.legend() 方法显示图例即可。




这样,我们就能一眼看出每条线所对应的商品。我们还可以看到,图例被放在了图表的左上方,图例位置其实是可以设置的,不设置的情况下 matplotlib 会帮你自动找一个合适的位置放置。


如果想自行选择图例位置的话可以通过 plt.legend() 方法的 loc 参数实现,loc 参数共有如下 11 种方式可供选择:



如果我们想将图例放到右下角就可以这么写:




到这里就结束了吗?不,还没有!我们还可以通过plt.xlabel()和plt.ylabel()方法来设置 x 轴和 y 轴的标签,还能通过plt.title()给图表设置标题。我们来看一下具体用法:




接下来是柱状图,柱状图描述的是分类数据,展示的是每一类的数量。柱状图分为很多种,有普通柱状图、堆叠柱状图、分组柱状图等,我们一一来看如何用 matplotlib 画出它们


绘制柱状图


普通柱状图的画法很简单,调用 plt.bar() 方法即可。我们需要传入两个参数,第一个参数是 x 轴上刻度的标签序列(列表、元组、数组等),第二个参数则用于指定每个柱子的高度,也就是具体的数据。


我们来看一个例子,下面代码画出了编程一班体育课选课的情况的柱状图:




将图表和代码结合起来看,你应该就明白了 plt.bar() 前两个必选参数的作用。plt.bar() 还有一些可选参数,常用的有 width 和 color,分别用于设置柱子的宽度(默认 0.8)和颜色。


比如我们可以将柱子宽度调小到 0.6,将柱子的颜色设成好看的天蓝色。




其实,我们学过的plt.xlabel()、plt.ylabel()、plt.title()和plt.legend()方法都是通用方法,并不只限制于一种图表,所有的图表类型都支持这些方法。这里就不再重复演示,你可以在后面的练习中动手试试。


柱状图能直观地展现出不同分类数据上的差异,但有时候我们想更进一步地分析每个分类数据的分布,比如每门选修课的男女比例,这时就需要用到堆叠柱状图。


堆叠柱状图


在画图之前,我们先来看看要画的堆叠柱状图长什么样。



总体和前面画的柱状图是一样的,只是每个柱子被分成了多块。堆叠柱状图不仅可以展示每一个分类的总量,还能展示该分类包含的每个小分类的大小及占比,因此非常适合处理部分与整体的关系。


与饼图显示单个部分到整体的关系不同的是,堆叠柱状图可以显示多个部分到整体的关系。例如编程一班选课的各项目人数统计,你可以用柱状图或饼图来展示。


但是,当需要进一步区分男生和女生参与到不同项目中的人数分别是多少时,就需要把每个项目中包含的男生数和女生数都展示出来。如图选用堆叠柱状图,不仅能显示每个项目的总人数,还能展示出每个项目中的一部分与整体的关系。



上面的代码和之前相比,多调用了一次plt.bar()方法,并传入了bottom参数。每调用一次plt.bar()方法就会画出对应的柱状图,而bottom参数作用就是控制柱状图低端的位置。我们将前一个柱状图的高度传进去,这样就形成了堆叠柱状图。


而如果我们没有设置bottom参数,后面的图形会盖在原来的图形之上,就像下面这样:



说完了上下堆叠的堆叠柱状图,我们来看看最后一种分组柱状图。


分组柱状图


分组柱状图经常用于不同组间数据的比较,这些组都包含了相同分类的数据。我们还是先来看一下最终绘制的图表长什么样,这有助于你对代码的理解。




这次的方法和之前略有不同,首先使用np.arange(3)方法创建了一个数组x,值为[0 1 2]。并定义了一个变量width用于指定柱子的宽度。


在调用plt.bar()时,第一个参数不再是刻度上的标签,而是对应的刻度。以[0 1 2]为基准,分别加上和减去柱子的宽度得到[-0.15 0.85 1.85]和[0.15 1.15 2.15],这些刻度将分别作为两组柱子的中点,并且柱子的宽度为 0.3。



因为传入的是刻度,而不是刻度的标签。因此,我们还要调用plt.xticks()方法来将 x 轴上刻度改成对应的标签。该方法的第一个参数是要更改的刻度序列,第二个参数是与之对应的标签序列。


同理,还要plt.yticks()方法来更改 y 轴上刻度的标签,这里就不再演示了。


最后我们来看一下 matplotlib 中饼图的画法。


饼图


饼图广泛得应用在各个领域,用于表示不同分类的占比情况,通过弧度大小来对比各种分类。饼图通过将一个圆饼按照分类的占比划分成多个区块,整个圆饼代表数据的总量,每个区块(圆弧)表示该分类占总体的比例大小,所有区块(圆弧)的加和等于 100%。


饼图的画法很简单,只要传入数据和对应的标签给 plt.pie() 方法即可。但为了让饼图更加直观清晰,需要了解一些额外的参数。


以 2018 年国内生产总值(GDP)三大产业的占比为例,可以画出这样的饼图:



画出这样一张饼图的代码如下:



我来给你解释一下 plt.pie() 方法每个参数的作用:第一个参数是绘图需要的数据;参数 labels 指定了数据对应的标签;参数 autopct 则给饼图自动添加百分比显示。


这里详细说一下 autopct 参数的格式,这里用到了字符串格式化输出的知识。上述代码中 '%0.1f%%' 可以分为两部分,一部分是 %0.1f 表示保留一位小数,同理 %0.2f 表示保留两位小数。


另一部分是 %%,其实它就表示输出一个 %,因为 % 还字符串格式化输出中有特殊的含义,所以想要输出 % 就得写成 %%。所以,'%0.1f%%' 的含义是保留一位小数的百分数,例如:53.3%。


我们还能通过 explode 参数来让饼图中的某一部分突出显示,来强调某项数据。




默认explode参数里的元素都是 0,我们将需要突出显示的部分对应位置的值设大一点,就能将对应的区块抽离出来突出显示。这个数值越大,抽离的效果就越明显。


绘制子图


到目前我们学到的都是绘制一张图表的方法。但是一张图表很难同时分析多个维度,我们需要把多张图绘制在一起,进行多个维度的查看比较。


Matplotlib 提供了子图的概念,通过使用子图,你可以在一张图里绘制多个图表。


在 matplotlib 中,我们可以调用 plt.subplot() 方法来添加子图。 plt.subplot() 方法的前两个参数分别是子图的行数和列数,第三个参数是子图的序号(从 1 开始)。我给你举个例子你就明白了:



plt.subplot(2, 2, 1)的作用是生成一个两行两列的子图,并选择其中序号为 1 的子图。所以上面的代码将一张图表分成了 4 个子图,并用 1、2、3、4 来选择对应位置的子图。



我们也可以不规则的子图,比如上面两张子图,下面一张子图。方法如下:



前两个子图的创建你能明白,第三个子图的创建你可能就不太懂了,为什么是 plt.subplot(2, 1, 2) 呢?


因为子图序号是独立的,与前面的创建的子图没有关系。plt.subplot(2, 2, 1) 选择并展示了 2*2 的子图中的第一个,plt.subplot(2, 2, 2) 选择并展示了 2*2 子图中的第二个,它俩合起来占了 2*2 的子图的第一行。


而 plt.subplot(2, 1, 2) 则是将生成了两行一列的子图,并选择了第二个。即占满第二行的子图,正好填补了之前 2*2 的子图剩下来的空间。因此生成的图表是这样的:



图表的框架画好了,我们还要往里面绘图。方法很简单,之前调用的是plt上的方法绘图,只要将其改成在plt.subplot()方法的返回值上调用相应的方法绘图即可。举个例子,下面代码在一张图上绘制了 sin、cos 和 tan 三个函数的图像。




最后,我们还能使用set_title()来为每个子图设置单独的标题。需要注意的是,如果想要给带有子图的图表设置总的标题的话,不是使用plt.title()方法,而是通过plt.suptitle()方法来设置带有子图的图表标题。




相关问题推荐

  • 回答 120

    相对前几年来说,要高上不少了,毕竟入行的人也是越来越多了,基础的工作对应想要参与的人群基数越来越大,但是对于高端人才的需求还是很多,人才还是相对稀缺性的。所以,想要学web或者其他技术也一样,别等,别观望。web前端就业方向特别多包括web前端开发...

  • 回答 25

    相对定位和绝对定位是定位的两种表现形式,区别如下:一、主体不同1、相对定位:是设置为相对定位的元素框会偏移某个距离。2、绝对定位:absolute 脱离文档流,通过 top,bottom,left,right 定位。二、特点不同1、相对定位:在使用相对定位时,无论是否进行移...

  • 抓包是什么意思?2020-04-01 17:36
    回答 7
    已采纳

    抓包(packet capture)就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作,也用来检查网络安全。抓包也经常被用来进行数据截取等。抓包可以通过抓包工具来查看网络数据包内容。通过对抓获的数据包进行分析,可以得到有用的信息。目前流行的...

  • 回答 89

    常用的前端框架有Bootstrap框架、React框架、Vue框架、Angular框架、Foundation框架等等

  • 回答 65
    已采纳

    前端是目的就业前景非常不错的一个计算机技术,但是自学的话还是有一定难度的,网络上自学是碎片化的,同时互联网技术跟新换代快,自己的话比较吃力也学习不到最新的技术。

  • SSR 是什么意思?2020-03-20 18:56
    回答 6

    SSR就是一台服务器,可以利用 SSR 在远程的服务器上配置 SSR,使其能够成为 SSR 节点,这样本地电脑或者其它设备利用 SSR 节点实现 VPN 或者远程上网及游戏加速等方面。ShadowsocksR(简称 SSR)是 Shadowsocks 分支,在 Shadowsocks 的基础上增加了一些数据...

  • 回答 52
    已采纳

    计算机培训方向比较多,建议找适合自己的方向选择培训编程类:JAVA、WEB、Python、C/C++、C#等测试类:软件测试运维类:云计算、网络安全设计类:UI设计、3D建模等

  • 回答 11

    1、代码判断xAxis: {type: 'time',splitLine: {show: false},interval: 3600, // 设置x轴时间间隔axisLabel: {formatter: function(value, index) {return liangTools.unix2hm(value)}}},首先要把xAxis 显示类型设置成time,然后设置对应X轴......

  • 回答 8

    HTML5 + CSS + JavaScript 开发 跨平台重用代码 

  • 回答 4

    采用rem单位自动响应,并提供独有栅格化系统快速定义宽高、边距节省css代码量,同时总结各大型移动端网页,提供一套ui颜色搭配规范,尺寸规范,字体规范等。

  • 回答 10

    iView UI、ioni、SUI

  • 回答 6

     jQTouch 

  • 回答 4

    如果只是普通的移动端用vue react 或者dva 如果是要编译成小程序什么的或者混生 就用uni-app(对应vue语法)taro(对应react) 或者纯原生 这个没有限制的,自己怎么舒服怎么来

  • 回答 4

    因为可以运用在网页和小程序的开饭中,而且开源,用着便宜,企业都很喜欢

  • 回答 10

    一、Visual Studio Code下载地址:https://code.visualstudio.com/微软在2015年4月30日Build 开发者大会上正式宣布了 Visual Studio Code 项目:一个运行于 Mac OS X、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。Visual Stud...

  • 回答 9

    jQuery自带淡入淡出效果 https://www.w3school.com.cn/jquery/jquery_fade.asp 看看这个 

没有解决我的问题,去提问