【使用matplotlib】使用统计函数绘制简单图形

使用统计函数绘制简单图形

1. 绘制简单图形

1.1.1 函数简介

1. bar(绘制柱形图)

import matplotlib as mpl
import matplotlib.pyplot as plt
import random
import string

def test():
    # 设置字体为黑体
    mpl.rcParams['font.family'] = 'SimHei'
    # 设置在中文字体是能够正常显示负号(“-”)
    mpl.rcParams['axes.unicode_minus'] = False
    x = [i for i in range(1, 9)]
    y = [random.choice(x) for i in range(8)]
    plt.bar(x,
            y,
            align="center",
            color="c",
            tick_label=[random.choice(string.ascii_lowercase) for i in range(8)],
            hatch="/")
    plt.xlabel('箱子编号')
    plt.ylabel('箱子重量(kg)')
    plt.show()

img

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

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.bar.html?highlight=bar#matplotlib.pyplot.bar

制作条形图。

使用给定的 alignment 将条形定位在 x。 它们的尺寸由 heightwidth 给出。 垂直基线是 bottom(默认 0)。

许多参数可以采用单个值应用于所有条形或一系列值,每个条形一个值。

参数:

x: float or array-like

条形的 x 坐标。 另请参阅 align 以了解条形与坐标的对齐方式。

height: float or array-like

条的高度。

width: float or array-like, default: 0.8

条的宽度。

bottom: float or array-like, default: 0

条形底的 y 坐标。

align: {'center', 'edge'}, default: 'center'

条形图与 x 坐标的对齐:

  • ‘center’:以 x 位置为中心。
  • ‘edge’:将条形的左边缘与 x 位置对齐。

要对齐右边缘的条形,请传递负 widthalign='edge'

2. barh(绘制条形图)

import matplotlib as mpl
import matplotlib.pyplot as plt
import random
import string


def test():
    # 设置字体为黑体
    mpl.rcParams['font.family'] = 'SimHei'
    # 设置在中文字体是能够正常显示负号(“-”)
    mpl.rcParams['axes.unicode_minus'] = False
    x = [i for i in range(1, 9)]
    y = [random.choice(x) for i in range(8)]
    plt.barh(x,
             y,
             align="center",
             color="c",
             tick_label=[random.choice(string.ascii_lowercase) for i in range(8)],
             hatch="/")
    plt.xlabel('箱子重量(kg)')
    plt.ylabel('箱子编号')
    plt.show()

img

matplotlib.pyplot.barh(y, width, height=0.8, left=None, *, align='center', **kwargs)

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.barh.html

3. hist(绘制直方图)

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np


def test():
    # 设置字体为黑体
    mpl.rcParams['font.family'] = 'SimHei'
    # 设置在中文字体是能够正常显示负号(“-”)
    mpl.rcParams['axes.unicode_minus'] = False
    box_weight = np.random.randint(0, 10, 100)
    x = box_weight
    bins = range(11)
    plt.hist(x,
             bins=bins,
             color="g",
             histtype="bar",
             rwidth=1,
             alpha=0.6)
    plt.xlabel('箱子重量(kg)')
    plt.ylabel('销售数量')
    plt.show()

img

matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, *, data=None, **kwargs)

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.hist.html?highlight=hist#matplotlib.pyplot.hist

绘制直方图。

计算并绘制 x 的直方图。 返回值是一个元组 (n, bins, patches) 或 ([n0, n1, …], bins, [patches0, patches1, … .]) 如果输入包含多个数据。 请参阅 weights 参数的文档以绘制已分箱数据的直方图。

多个数据可以通过 x 作为可能不同长度的数据集列表 ([x0, x1, …]) 提供,或者作为每列是一个数据集的 2D ndarray 提供。 请注意,ndarray 形式相对于列表形式进行了转置。

不支持掩码数组。

binsrangeweightsdensity 参数的行为类似于 [numpy.histogram](https://numpy.org/doc/stable/reference/generated/numpy.histogram.html #numpy.histogram)。

参数:

x: (n,) array or sequence of (n,) arrays

输入值,这需要单个数组或不需要具有相同长度的数组序列。(这个数据是被统计频次的数据)

bins: int or sequence or str, default: rcParams["hist.bins"] (default: 10)

如果 bins 是一个整数,它定义了范围内等宽 bin 的数量。

如果bins是一个序列,它定义了bin边缘,包括第一个bin的左边缘和最后一个bin的右边缘; 在这种情况下,bin 的间距可能不相等。 除了最后一个(最右边的)bin外,所有bin都是半开的(左开右闭的区间)。 换句话说,如果 bins 是:

[1, 2, 3, 4]

那么第一个 bin 是 [1, 2)(包括 1,但不包括 2)和第二个 [2, 3)。 然而,最后一个 bin 是 [3, 4],它包括 4。

如果 bins 是一个字符串,它是 numpy.histogram_bin_edges 支持的分箱策略之一 ): ‘auto’、‘fd’、‘doane’、‘scott’、‘stone’、‘rice’、‘sturges’ 或 ‘sqrt’。

range: tuple or None, default: None

bin 的下限和上限范围。 忽略上下异常值。 如果未提供,range(x.min(), x.max())。 如果 bins 是一个序列,则范围无效。

如果 bins 是一个序列或指定了 range,则自动缩放基于指定的 bin 范围而不是 x 的范围。

density: bool, default: False

如果为True,则绘制并返回概率密度:每个 bin 将显示 bin 的原始计数除以计数总数 和 bin 宽度 (density = counts / (sum(counts) * np.diff(bins ))),使得直方图下的面积积分为 1 (np.sum(density * np.diff(bins)) == 1)。

如果 stacked 也是 True,则直方图的总和归一化为 1。

weights: (n,) array-like or None, default: None

x 形状相同的权重数组。 x 中的每个值仅将其相关权重贡献给 bin 计数(而不是 1)。 如果 densityTrue,则权重被归一化,因此密度在该范围内的积分保持为 1。

此参数可用于绘制已分箱数据的直方图,例如 使用 numpy.histogram (通过将每个 bin 视为单个点,其权重等于其 数数)

counts, bins = np.histogram(data)
plt.hist(bins[:-1], bins, weights=counts)

(或者您也可以使用 bar())。

cumulative: bool or -1, default: False

如果True,则计算直方图,其中每个 bin 给出该 bin 中的计数加上所有 bin 的较小值。 最后一个 bin 给出了数据点的总数。

如果 density 也是 True,则直方图被归一化,使得最后一个 bin 等于 1。

如果 cumulative 是小于 0 的数字(例如 -1),则累积的方向相反。 在这种情况下,如果 density 也是 True,则直方图被归一化,使得第一个 bin 等于 1。

bottom: array-like, scalar, or None, default: None

每个箱子底部的位置,即。 bin 从 bottom 绘制到 bottom + hist(x, bins) 如果是标量,则每个 bin 的底部移动相同的量。 如果是数组,则每个 bin 都会独立移动,并且底部的长度必须与 bin 的数量相匹配。 如果没有,默认为 0。

histtype: {'bar', 'barstacked', 'step', 'stepfilled'}, default: 'bar'

  • 要绘制的直方图类型。
    • bar 是传统的条形直方图。 如果给出多个数据,则条形图并排排列。
    • barstacked 是条形直方图,其中多个数据堆叠在一起。
    • step 生成默认未填充的线图。
    • stepfilled 生成一个默认填充的线图。

align: {'left', 'mid', 'right'}, default: 'mid'

  • 直方图条的水平对齐方式。
    • ‘left’:条形图位于 bin 左侧边缘的中心。
    • ‘mid’:条在 bin 边缘之间居中。
    • ‘right’:条形图位于右侧 bin 边缘的中心。

orientation: {'vertical', 'horizontal'}, default: 'vertical'

如果是“水平”,则 barh 将用于 bar 类型 histograms 和 bottom kwarg 将是左边缘。

rwidth: float or None, default: None

条的相对宽度,作为 bin 宽度的一部分。 如果为“无”,则自动计算宽度。

如果 histtype 是 ‘step’ 或 ‘stepfilled’ 则忽略。

rwidth=0.8的效果

img

log: bool, default: False

如果为True,直方图轴将设置为对数刻度。

color: color or array-like of colors or None, default: None

颜色或颜色序列,每个数据集一个。 默认 (None) 使用标准线条颜色序列。

label: str or None, default: None

字符串或字符串序列以匹配多个数据集。 条形图为每个数据集生成多个补丁,但只有第一个获得标签,因此 [legend](https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.legend.html#matplotlib. axes.Axes.legend) 将按预期工作。

stacked: bool, default: False

如果为True,则多个数据相互堆叠如果为False,则如果 histtypebar,则多个数据并排排列,如果 histtypestep,则多个数据相互叠加

4. pie(绘制饼图)

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np


def test():
    # 设置字体为黑体
    mpl.rcParams['font.family'] = 'SimHei'
    # 设置在中文字体是能够正常显示负号(“-”)
    mpl.rcParams['axes.unicode_minus'] = False

    # 这个tuple类型
    kinds = "简易箱", "保温箱", "行李箱", "密封箱"
    colors = ['#e41a1c', '#377eb8', '#4daf4a', '#984ea3']
    soldNums = [0.05, 0.45, 0.15, 0.35]

    plt.pie(soldNums,
            labels=kinds,
            autopct="%3.1f%%",
            startangle=60,
            colors=colors)
    plt.title("不同类型的箱子的销售数量占比")
    plt.show()

img

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, *, normalize=True, data=None)

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.pie.html?highlight=pie#matplotlib.pyplot.pie

绘制饼图。

制作数组 x 的饼图。 每个楔形的小数面积由x/sum(x)给出。 如果 sum(x) < 1,则 x 的值直接给出小数面积,数组不会被归一化。 生成的饼图将有一个大小为1 - sum(x)的空楔形。

楔形按逆时针方向绘制,默认从 x 轴开始。

参数:

x1D array-like

楔形大小。(给的是累加和等于1的list)

explode: array-like, default: None

如果不是 None,则为 len(x) 数组,它指定偏移每个楔形的半径分数。

labels: list, default: None

为每个楔形提供标签的字符串序列(元组和list都可以)

colors: array-like, default: None

饼图将循环使用的一系列颜色。 如果 None,将使用当前活动循环中的颜色(这个应该是有一套自己的默认颜色组合)。

autopct: None or str or callable, default: None

如果不是 None,是一个字符串或函数,用于用它们的数值标记楔形。 标签将放置在楔形内。 如果它是格式字符串,则标签将为 fmt % pct。 如果它是一个函数,它将被调用。

autopct="%4.2f%%"

4表示显示数字的最大位数

2表示小数点保留几位小数

%表示百分比计算

pctdistance: float, default: 0.6

每个饼图的中心与 autopct 生成的文本的开头之间的比率。 如果 autopctNone,则忽略。

shadow: bool, default: False

在馅饼下面画一个阴影。

normalize: bool, default: True

True 时,总是通过标准化 x 来制作一个完整的饼图,以便 sum(x) == 1False 如果 sum(x) <= 1 则制作部分饼图,并为 sum( x) > 1

labeldistance: float or None, default: 1.1

绘制饼图标签的径向距离。 如果设置为 None,标签不会被绘制,但会存储在 legend() 中使用

startangle: float, default: 0 degrees

饼图起点从 x 轴逆时针旋转的角度。

radius:float, default: 1

饼的半径。

counterclock: bool, default: True

指定分数方向,顺时针或逆时针。

wedgeprops: dict, default: None

传递给制作馅饼的楔形对象的参数字典。 例如,您可以传入 wedgeprops = {'linewidth': 3} 来设置楔形边框线的宽度等于 3。有关更多详细信息,请查看楔形对象的文档/参数。 默认情况下 clip_on=False

textprops: dict, default: None

传递给文本对象的参数字典。

center: (float, float), default: (0, 0)

图表中心的坐标。

frame: bool, default: False

如果为真,则使用图表绘制轴框。

rotatelabels: bool, default: False

如果为真,则将每个标签旋转到相应切片的角度。

data: indexable object, optional

如果给定,以下参数也接受字符串 s,它被解释为 data[s](除非这引发异常):x, explode, labels, colors

5. polar(绘制极线图)

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np


def test():
    # 设置字体为黑体
    mpl.rcParams['font.family'] = 'SimHei'
    # 设置在中文字体是能够正常显示负号(“-”)
    mpl.rcParams['axes.unicode_minus'] = False

    # 这个tuple类型
    barSlices = 12
    # 在0-2π均匀取12个值
    theta = np.linspace(0.0, 2*np.pi, barSlices, endpoint=False)
    # 生成 30*[0.1) 12个一维数组
    r = 30 * np.random.rand(barSlices)
    # chartreuse 是一种淡绿色
    plt.polar(theta, r, color="chartreuse", linewidth=2, marker='*', mfc="b", ms=10)
    plt.title("极线图")
    plt.show()

img

matplotlib.pyplot.polar(*args, **kwargs)

制作一个极坐标图。

调用签名:

polar(theta, r, **kwargs)

支持多个 thetar 参数,带有格式字符串,如 plot

这个参数全部参考plot

6. scatter(绘制气泡图)

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np


def test():
    # 设置字体为黑体
    mpl.rcParams['font.family'] = 'SimHei'
    # 设置在中文字体是能够正常显示负号(“-”)
    mpl.rcParams['axes.unicode_minus'] = False

    a = np.random.randn(100)
    b = np.random.randn(100)
    # RdYlBu属于中间渐变色
    plt.scatter(a, b, s=np.power(10*a+20*b, 2),
                c=np.random.rand(100),
                cmap=mpl.cm.RdYlBu,
                marker="o")

    plt.title("气泡图")
    plt.show()

img

matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)

具有不同标记大小和(或)颜色的 y 与 x 的散点图。

参数:

x, y: float or array-like, shape (n, )

数据位置。

s: float or array-like, shape (n, ), optional

以点为单位的标记大小**2。 默认为 rcParams['lines.markersize'] ** 2

c: array-like or list of colors or color, optional

标记颜色。可能的值:

  • 使用 cmapnorm 将 n 个数字的标量或序列映射到颜色。(就是说在cmap的渐变色块选取颜色,可以是个随机数)
  • 一个二维数组,其中行是 RGB 或 RGBA。
  • 长度为 n 的颜色序列。
  • 单一颜色格式字符串。

请注意,c 不应是单个数字 RGB 或 RGBA 序列,因为它与要进行颜色映射的值数组无法区分。如果要为所有点指定相同的 RGB 或 RGBA 值,请使用具有单行的二维数组。否则,在大小与 xy 匹配的情况下,值匹配将具有优先权。

如果您希望为所有点指定单一颜色,请首选 color 关键字参数。

默认为 None。在这种情况下,标记颜色由 colorfacecolorfacecolors 的值确定。如果未指定这些或 None,则标记颜色由当前的 Axes’ 的下一个颜色确定“形状和填充”颜色循环。这个循环默认为 rcParams["axes.prop_cycle"] (默认: cycler('color', ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b'、'#e377c2'、'#7f7f7f'、'#bcbd22'、'#17becf']))。

marker: MarkerStyle, default: rcParams["scatter.marker"] (default: ‘o’)

标记样式。 marker 可以是类的实例,也可以是特定标记的文本简写。 有关标记样式的更多信息,请参阅 matplotlib.markers

cmap: str or Colormap, default: rcParams["image.cmap"] (default: 'viridis')

Colormap 实例或注册的颜色图名称。 cmap 仅在 c 是浮点数组时使用。

normNormalize, default: None

如果 c 是浮点数数组,norm 用于在 0 到 1 范围内缩放颜色数据 c,以便映射到颜色映射 cmap。 如果 None,使用默认的 colors.Normalize

vmin, vmax: float, default: None

vminvmax 与默认规范一起使用,以将颜色数组 c 映射到颜色图 cmap。 如果没有,则使用颜色数组的相应最小值和最大值。 在给出 norm 时使用 vmin/vmax 是错误的。

alpha: float, default: None

Alpha 混合值,介于 0(透明)和 1(不透明)之间。

linewidths: float or array-like, default: rcParams["lines.linewidth"] (default: 1.5)

标记边缘的线宽。 注意:默认的 edgecolors 是 ‘face’。 您可能也想更改此设置。

edgecolors: {'face', 'none', *None*} or color or sequence of color, default: rcParams["scatter.edgecolors"] (default: ‘face’)

标记的边缘颜色。 可能的值:

  • ‘face’:边缘颜色将始终与面颜色相同。
  • ‘none’:不绘制补丁边界。
  • 颜色或颜色序列。

对于未填充的标记,edgecolors 将被忽略。 相反,颜色是像使用 ‘face’ 确定的,即来自 ccolorsfacecolors

plotnonfinite: bool, default: False

是否使用非有限 c 绘制点(即 inf-infnan)。 如果为“真”,则使用 bad 颜色图颜色绘制点(请参阅 [Colormap.set_bad](https://matplotlib.org/stable/api/_as_gen/matplotlib.colors.Colormap.html#matplotlib.colors .Colormap.set_bad))。

7. stem(绘制棉棒图)

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np


def test():
    # 设置字体为黑体
    mpl.rcParams['font.family'] = 'SimHei'
    # 设置在中文字体是能够正常显示负号(“-”)
    mpl.rcParams['axes.unicode_minus'] = False

    x = np.linspace(0.5, 2*np.pi, 20)
    # randn函数返回一个或一组样本,具有标准正态分布。
    y = np.random.randn(20)
    plt.stem(x, y, linefmt="-.", markerfmt="o", basefmt="-")
    plt.title("棉棒图")
    plt.show()

img

matplotlib.pyplot.stem(*args, linefmt=None, markerfmt=None, basefmt=None, bottom=0, label=None, use_line_collection=True, orientation='vertical', data=None)

https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.stem.html?highlight=stem#matplotlib.pyplot.stem

创建一个棉棒图(茎图)。

棉棒图在每个位置 locs 处从基线到 heads 绘制垂直于基线的线,并在此处放置一个标记。 对于垂直棉棒图(默认),locsx 位置,headsy 值。 对于水平茎图,locsy 位置,headsx 值。

猜你喜欢

转载自blog.csdn.net/myt2000/article/details/127668539