【matplotlib 实战】--面积图

matplotlib,实战,面积 · 浏览次数 : 15

小编点评

**主要元素面积图**是一种用于展示数据分布或密度的图表类型,主要由数据点、面积、以及X轴和Y轴组成。 **适用的场景** * 数据分布分析 * 市场需求分析 * 健康状况分析 **不适用的场景** * 数据精确性要求较高的分析场景 * 需要显示数据细节的分析场景 * 需要进行多维数据分析的场景 **分析实战** ```python import matplotlib.pyplot as plt # 加载数据 fp = "d:/share/A0201.csv" df = pd.read_csv(fp) # 1. 数据清理 key1 = "国民总收入(亿元)" key2 = "人均国内生产总值(元)" df_filtered = df[df[key1] == key1].head() df_filtered = df_filtered[df[key2] == key2].head() # 2. 创建面积图 fig, ax = plt.subplots() ax.xaxis.set_major_locator(MultipleLocator(4)) ax.xaxis.set_minor_locator(MultipleLocator(2)) # 3. 绘制面积图 ax.fill_between(df_filtered["sjCN"], df_filtered["value"], label="国民总收入(万亿元)") ax.legend(loc="upper left") # 4. 设置坐标轴单位 ax.set_xlabel("时间") ax.set_ylabel("值") ax.tick_params(axis="y", labelcolor="w") # 5. 显示面积图 plt.show() ```

正文

面积图,或称区域图,是一种随有序变量的变化,反映数值变化的统计图表。

面积图也可用于多个系列数据的比较。
这时,面积图的外观看上去类似层叠的山脉,在错落有致的外形下表达数据的总量和趋势。
面积图不仅可以清晰地反映出数据的趋势变化,也能够强调不同类别的数据间的差距对比。

面积图的特点在于,折线与自变量坐标轴之间的区域,会由颜色或者纹理填充。
但它的劣势在于,填充会让形状互相遮盖,反而看不清变化。一种解决方法,是使用有透明度的颜色,来“让”出覆盖区域。

1. 主要元素

面积图是一种用于展示数据分布或密度的图表类型,主要由数据点、面积、以及X轴和Y轴组成。
面积图可以直观地反映数据的分布情况。

面积图的主要构成元素包括:

  1. 数据点:表示数据的具体位置和大小
  2. 面积:表示数据的分布或密度
  3. X轴:一般是有序变量,表示数据点的变化区间
  4. Y轴:数据点在不同时刻的值

image.png

2. 适用的场景

面积图适用于以下分析场景:

  • 数据分布分析:帮助分析人员了解数据的分布情况,如城市的大小、人口分布等。
  • 市场需求分析:帮助企业了解市场需求的变化趋势,如销售额的增长情况等。
  • 健康状况分析:帮助医生了解患者的健康状况,如体温、血压等数据的变化趋势。

3. 不适用的场景

面积图不适用于以下分析场景:

  • 数据的精确性要求较高的分析场景:面积图无法精确地反映数据的分布情况,在需要精确数据的场景中不适用。
  • 需要显示数据细节的分析场景:面积图无法直观地显示数据的细节和变化趋势,在需要显示数据细节的场景中不适用。
  • 需要进行多维数据分析的场景:面积图无法直接展示多维数据,在需要进行多维数据分析的场景中不适用。

4. 分析实战

这次使用国内生产总值相关数据来实战面积图的分析。

4.1. 数据来源

数据来源国家统计局公开数据,已经整理好的csv文件在:https://databook.top/nation/A02

本次分析使用其中的 A0201.csv 文件(国内生产总值数据)。

下面的文件路径 fp 要换成自己实际的文件路径。

fp = "d:/share/A0201.csv"

df = pd.read_csv(fp)
df

image.png

4.2. 数据清理

从中过滤出国内生产总值(亿元)人均国内生产总值(元),然后绘制面积图看看有什么发现。

key1 = "国民总收入(亿元)"
df[df["zbCN"]==key1].head()

image.png

key2 = "人均国内生产总值(元)"
df[df["zbCN"]==key2].head()

image.png

4.3. 分析结果可视化

国内生产总值(亿元)的面积图:

from matplotlib.ticker import MultipleLocator

with plt.style.context("seaborn-v0_8"):
    fig = plt.figure()
    ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
    ax.xaxis.set_major_locator(MultipleLocator(4))
    ax.xaxis.set_minor_locator(MultipleLocator(2))

    data = df[df["zbCN"] == key1].copy()
    data["value"] = data["value"] / 10000
    data = data.sort_values(by="sj")
    ax.fill_between(data["sjCN"], data["value"], label="国民总收入(万亿元)")

    ax.legend(loc="upper left")

image.png

上面的代码把Y轴的单位改成了万亿元,原先的亿元作为单位,数值太大。
面积图来展示分析结果,不像折线图那样,仅仅只是变化趋势的感觉;
通过折线下的面积不断扩大,会感觉到国民总收入的总量在不断变大,且2006年之后,总量增速明显提高。

同样分析步骤,人均收入的面积图如下:

from matplotlib.ticker import MultipleLocator

with plt.style.context("seaborn-v0_8"):
    fig = plt.figure()
    ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
    ax.xaxis.set_major_locator(MultipleLocator(4))
    ax.xaxis.set_minor_locator(MultipleLocator(2))

    data = df[df["zbCN"] == key2].copy()
    data = data.sort_values(by="sj")
    ax.fill_between(data["sjCN"], data["value"], label=key2)

    ax.legend(loc="upper left")

image.png

接下来,我们把国民总收入人均收入放在一起看,但是,这两组数据的单位不一样(一个是万亿元,一个是元)。
所以要用到之前 matplotlib基础系列中介绍的双坐标轴技巧来展示。

from matplotlib.ticker import MultipleLocator

with plt.style.context("seaborn-v0_8"):
    fig = plt.figure()
    ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
    ax.xaxis.set_major_locator(MultipleLocator(4))
    ax.xaxis.set_minor_locator(MultipleLocator(2))
    ax_twinx = ax.twinx()

    data = df[df["zbCN"] == key1].copy()
    data["value"] = data["value"] / 10000
    data = data.sort_values(by="sj")
    ax.fill_between(data["sjCN"], data["value"], 
                    alpha=0.5, label="国民总收入(万亿元)")

    data = df[df["zbCN"] == key2].copy()
    data = data.sort_values(by="sj")
    ax_twinx.fill_between(data["sjCN"], data["value"], 
                          color='r', alpha=0.2, label=key2)

    ax.legend(loc="upper left")
    ax_twinx.legend(loc="upper right")

image.png

两个面积图用了不同颜色,并加了透明度(即alpha 参数),不加透明度,颜色会互相覆盖。
左边的Y轴是国民总收入右边的Y轴是人均收入
这两个面积图几乎完全重合,正说明了国民总收入人均收入是强相关的。

与【matplotlib 实战】--面积图相似的内容:

【matplotlib 实战】--面积图

面积图,或称区域图,是一种随有序变量的变化,反映数值变化的统计图表。 面积图也可用于多个系列数据的比较。这时,面积图的外观看上去类似层叠的山脉,在错落有致的外形下表达数据的总量和趋势。面积图不仅可以清晰地反映出数据的趋势变化,也能够强调不同类别的数据间的差距对比。 面积图的特点在于,折线与自变量坐标

【matplotlib 实战】--堆叠面积图

堆叠面积图和面积图都是用于展示数据随时间变化趋势的统计图表,但它们的特点有所不同。面积图的特点在于它能够直观地展示数量之间的关系,而且不需要标注数据点,可以轻松地观察数据的变化趋势。而堆叠面积图则更适合展示多个数据系列之间的变化趋势,它们一层层的堆叠起来,每个数据系列的起始点是上一个数据系列的结束点

【matplotlib 实战】--饼图

饼图,或称饼状图,是一个划分为几个扇形的圆形统计图表。在饼图中,每个扇形的弧长(以及圆心角和面积)大小,表示该种类占总体的比例,且这些扇形合在一起刚好是一个完全的圆形。 饼图最显著的功能在于表现“占比”。习惯上,人们通过比较饼图扇形的大小来获得对数据的认知。 使用饼图时,须确认各个扇形的数据加起来等

【matplotlib 实战】--百分比柱状图

百分比堆叠式柱状图是一种特殊的柱状图,它的每根柱子是等长的,总额为100%。柱子内部被分割为多个部分,高度由该部分占总体的百分比决定。 百分比堆叠式柱状图不显示数据的“绝对数值”,而是显示“相对比例”。但同时,它也仍然具有柱状图的固有功能,即“比较”——我们可以通过比较多个柱子的构成,分析数值之间的

【matplotlib 实战】--堆叠柱状图

堆叠柱状图,是一种用来分解整体、比较各部分的图。与柱状图类似,堆叠柱状图常被用于比较不同类别的数值。而且,它的每一类数值内部,又被划分为多个子类别,这些子类别一般用不同的颜色来指代。 柱状图帮助我们观察“总量”,堆叠柱状图则可以同时反映“总量”与“结构”。也就是说,堆叠柱状图不仅可以反映总量是多少?

【matplotlib 实战】--直方图

直方图,又称质量分布图,用于表示数据的分布情况,是一种常见的统计图表。 一般用横轴表示数据区间,纵轴表示分布情况,柱子越高,则落在该区间的数量越大。构建直方图时,首先首先就是对数据划分区间,通俗的说即是划定有几根柱子(比如,1980年~2020年的数据,每5年划分一个区间的话,共8个区间)。接着,对

【matplotlib 实战】--柱状图

柱状图,是一种使用矩形条,对不同类别进行数值比较的统计图表。在柱状图上,分类变量的每个实体都被表示为一个矩形(通俗讲即为“柱子”),而数值则决定了柱子的高度。 1. 主要元素 柱状图是一种用长方形柱子表示数据的图表。它包含三个主要元素: 横轴(x轴):表示数据的类别或时间。 纵轴(y轴):表示数据的

【matplotlib 实战】--平行坐标系

平行坐标系是一种统计图表,它包含多个垂直平行的坐标轴,每个轴表示一个字段,并用刻度标明范围。通过在每个轴上找到数据点的落点,并将它们连接起来形成折线,可以很容易地展示多维数据。随着数据增多,折线会堆叠,分析者可以从中发现数据的特性和规律,比如发现数据之间的聚类关系。 尽管平行坐标系与折线图表面上看起

【matplotlib 实战】--折线图

折线图是一种用于可视化数据变化趋势的图表,它可以用于表示任何数值随着时间或类别的变化。 折线图由折线段和折线交点组成,折线段表示数值随时间或类别的变化趋势,折线交点表示数据的转折点。 折线图的方向表示数据的变化方向,即正变化还是负变化,折线的斜率表示数据的变化程度。 1. 主要元素 折线图主要由以下

Python从零到壹丨带你了解图像直方图理论知识和绘制实现

摘要:本文将从OpenCV和Matplotlib两个方面介绍如何绘制直方图,这将为图像处理像素对比提供有效支撑。 本文分享自华为云社区《[Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现》,作者:eastmount。 一.图像直方图理论知识 灰度直方图是灰度级的函数,描述