matplotlib (二) 几种常见图绘制

几种常见图形

  • 对比分析:直方图,柱状图,雷达图,箱线图
  • 趋势分析:折线图,面积图
  • 占比分析:饼图,矩形树图
  • 相关分析:散点图
  • 地理分布分析:地图

一. 条形图(柱状图)

含义:用长条形 横轴 x宽度 表示每一个类别,长条形的 纵轴 y 长度表示类别的频数。

1. 正向条形图

函数与参数:

.bar(x, height, width=0.8, bottom=None, align='center', color='b', edgecolor='w', linewidth=None, hatch=None, joinstyle='miter', visiable=True, log=False, label=None)

x           --- 横坐标数据。
height      --- 高度,相当于y,即纵坐标数据。
width       --- 柱子的宽度,默认为0.8。
bottom      --- 柱子底部从y轴的哪一个值开始显示,即y轴底部最小值改为该值。
align       --- 柱子相对于刻度的位置。默认'center',刻度位于柱子中间。可选:'edge',即刻度在柱子的左边缘;将width设置为负数,可将刻度设置到柱子右边。
color       --- 柱子的颜色,默认蓝色-blue。
edgecolor   --- 柱子边缘的颜色,默认白色-white。
linewidth   --- 柱子边缘的宽度。
hatch       --- 柱子内的图案。可选:'/', '\\', '|', '-', '+', 'x', 'o', 'O', '.', '*'
joinstyle   --- 柱子顶部的尖角形状,默认为'miter',即直角。可选: 'round', 'bevel',即圆角和倾斜角。
visiable    --- 图案是否可见,默认TrueFalse即为空图。
log         --- 将y轴设置为log数据,默认为False。
label       --- 图片自身的标签。

返回值:
返回值为:BarContainer,一个存储了条形图的容器,条形图类型是:matplotlib.patches.Rectangle

下面柱状图例子的返回值:
在这里插入图片描述

例子:

movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}

plt.bar(x=list(movies.keys()), height=list(movies.values()), width=0.8, align='center', alpha=0.2, color='red', linewidth=9, edgecolor='b', hatch='\\', joinstyle='round')
plt.xticks(list(movies.keys()), rotation=90)
plt.grid()

结果显示:
在这里插入图片描述

2. 横向条形图

函数与参数:
.barh(y, width, height=0.8, bottom=None, align='center', color='b', edgecolor='w', linewidth=None, hatch=None, joinstyle='miter', visiable=True, log=False, label=None)
注意:第一个参数变成y,即指定y轴的对象;第二个参数和第三个参数交换了位置,因为正向图柱子的宽度,为横向图柱子的长度、高度,正向图柱子的高度为横向图柱子的宽度。以正向图为标准理解。其余参数同上。

返回值:
返回值为:BarContainer,一个存储了条形图的容器,条形图类型是:matplotlib.patches.Rectangle

下面例子柱状图的返回值:
在这里插入图片描述
例子:

movies = {
    "流浪地球":40.78,
    "飞驰人生":15.77,
    "疯狂的外星人":20.83,
    "新喜剧之王":6.10,
    "廉政风云":1.10,
    "神探蒲松龄":1.49,
    "小猪佩奇过大年":1.22,
    "熊出没·原始时代":6.71
}

plt.barh(y=list(movies.keys()), width=list(movies.values()), height=0.8, left=None,align='center', alpha=0.5, color='red', linewidth=4, edgecolor='b', hatch='\\', joinstyle='round')

plt.grid()

结果显示:
在这里插入图片描述

3. 分组条形图

分组条形图不是一种新的绘图函数,而是一种绘图方法、技巧。通过对柱子按需求进行分类,以及调整和控制各类柱子之间以及每类柱子之间的距离,来达到一个新的图形显示效果。

数据: — 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]
}

需求:显示每个电影5天票房对比条形图,显示在一个画布上。(一个画布即一张图,后面会深入探讨画布的属性以及多个画布的绘图)
代码

plt.figure(figsize=(20, 9))
wid=0.3
days = 5
distance = np.arange(0, days*3, 3)

movies_df = pd.DataFrame(movies)
for index in range(len(movies_df.columns)):
    days_tickets = movies_df.iloc[:,index]
    x = distance-wid*(3-index)
    print(x)
    plt.bar(x=x, height=days_tickets, width=wid, label=movies_df.columns[index])
    
    for tickets, x in zip(days_tickets, x):
        if index > (len(movies_df.columns))/2:
            plt.annotate(tickets, xy=(x, tickets), xytext=(x-0.3, tickets+(index-1)*0.6), fontsize=20)
        else:
            plt.annotate(tickets, xy=(x, tickets), xytext=(x-0.3, tickets+0.5), fontsize=20)


plt.xticks(np.arange(0, days*3, 3), ["第一天", "第二天", "第三天", "第四天", "第五天"], fontsize=20)
plt.yticks(np.arange(0, days*3, 3), fontsize=20)

plt.xlabel("天数", fontsize=30)
plt.ylabel("票房 / 亿", fontsize=30)

plt.legend(prop={"size":20})

结果显示
在这里插入图片描述

4. 堆叠条形图

将条形图再进行细分,分成子条形图

如下图,显示每个条形图的男孩女孩数量的子条形图:

boys = (20, 35, 30 ,35, 27)
girls = (25, 32, 34, 20, 25)

classes = ('C1', 'C2', 'C3', 'C4', 'C5')

x = np.arange(len(boys))

plt.bar(x, boys)
plt.bar(x, girls, bottom=boys)

plt.xticks(x, classes)

在这里插入图片描述

* 文档

官方文档-bar

二. 直方图

函数与参数:

一种展示连续数据分布特征的统计报告图(柱状图主要展现离散型数据分布)
.hist(x, bins=None, range=None, color='b', alpha=1, edgecolor=None, bottom=None, density=False, log=False, label=None, orientation='vertical')

x            --- 数组 或 序列
bins         --- 数字 或 序列。数字代表分成的组数;序列按照具体值分组,默认左闭右开。
color        --- 条形图颜色
alpha        --- 透明度
edgecolor    --- 条形图边界颜色。简写ec。
bottom       --- y轴底部从指定值开始
density      --- 将得到的直方图向量归一化,默认为False,纵坐标y表示频数;x与y的关系类似于条形图。True表示归一化,纵坐标y表示:频率 / 组距;x与y面积表示频率 。(频数:落在样本中数据的个数,频率:样本个数 / 总个数)
log          --- y轴显示为指数刻度
orientation  --- 默认柱子为垂直的,vertical。horizontal设置为水平的。

返回值:

n           --- 数组。每个区间内值出现的个数,如果density=True,则值为:频率/组距
bins        --- 数组。区间的值。
patches     --- 数组。表示每根柱子的对象,类型为matplotlib.patches.Rectangle

下面例子直方图的返回值,注意按区间来划分个数,而不是一个值
在这里插入图片描述

例子:

datas = [10, 20, 15, 10, 20, 30, 50, 20, 35, 55]
set_bins = np.arange(10,66, 5)

# 画布大小
plt.figure(figsize=(10,8))

# 直方图
frequency,_,_ = plt.hist(datas, bins=set_bins, edgecolor='k', align='left', color='red', alpha=0.5,)

# 折线图
plt.plot(set_bins[:-1], frequency)

结果显示:
在这里插入图片描述

应用场景

  1. 显示各组数据数量分布的情况。
  2. 用于观察异常或孤立数据。
  3. 抽取的样本数量过小,将会产生较大误差,可信度低,也就失去了统计的意义。因此,样本数不应少于50个。

* 文档

官方文档-hist

三. 散点图

将所有数据以点的形式展现在直角坐标系上,以显示变量之间相互影响程度,点的位置由变量的数值决定。

通过观察散点图上数据点的分布情况,可以推断变量间的相关性:
变量之间若存在相互关系,大部分数据点会相对密集,并以某种趋势呈现。
变量之间若不存在相互关系,散点图会表现为随机分布的离散点。

数据的相关性主要分为:
正相关、负相关、不相关、线性相关、指数相关等等

离点集群较远的点,成为离群点异常点

函数与参数:
plt.scatter(x, y, color='b', alpha=None, marker='o', linewidths=None, edgecolors=None)

x, y        --- 两个变量数据
color       --- 数据点颜色
alpha       --- 数据点与边缘透明度
marker      --- 数据点的形状、风格
linewidths  --- 数据点边缘宽度
edgecolors  --- 数据点边缘颜色

* 文档

官方文档-scatter

四. 饼图

函数与参数:
plt.pie(x, explode=None, labels=None, colors=None, autopct=None,pctdistance=0.6,shadow=False,labeldistance=1.1, startangle=0, radius=1, counterclock=True)

x               --- 类数组数据序列。
explode         --- 类数组序列,如元祖(0, 0.2, 0, 0.2, 0, 0), 显示要 突出的饼块 以及 突出的程度。
labels          --- 列表。显示饼块标签,一般显示在饼图外圈。
colors          --- 类数组序列。按索引指定每个饼块的颜色。
autopct         --- 设置比例文字的展示方式。
pctdistance     --- 默认距离0.6。设置比例文字与圆心的距离。
shadow          --- 默认False,平面显示。True:饼图下方显示阴影,呈现立体状。
labeldistance   --- 默认距离1.1。设置标签到圆心的距离。
startangle      --- 默认为0。以x轴正方向为起点,角度0开始,指定旋转角度。
radius          --- 默认长度1。设置饼的半径。
counterclock    --- 默认True,顺时针方向。False指定逆时针方向。
textprops       --- 设置标签属性。字典形式。
wedgeprops      --- 设置楔形属性。字典形式。
center          --- 设置饼心的位置。
frame           --- 默认False。设置True:给饼图加个轴。
rotatelabels    --- 默认False。设置True:每个标签旋转到相应饼块的角度

返回值:

patches         --- 饼图上每个分块的对象。
类matplotlib.patches.Wedge实例

texts           --- 分块的名字文本对象。
类matplotlib.text.Text实例

autotexts       --- 分块的比例文字对象
类matplotlib.text.Text实例标签
只有当autopct不为None时才返回此值

下面例子的返回值,一个元祖中三个列表代表不同对象,可分别赋予参数接收:
在这里插入图片描述
例子:

oses = {
'windows7':60.86,
'windows10': 18.46,
'windows8': 3.61,
'windows xp': 10.3,
'mac os': 6.78,
'其他': 1.12
}

names = list(oses.keys())
percents = list(oses.values())
patches,texts,autotexts = plt.pie(percents, labels=names, autopct="%.2f%%", textprops={'fontsize':20}, wedgeprops = {'linewidth': 3, 'edgecolor':'g'}, frame=True, center=(0.2,0.2), rotatelabels=True)

结果显示:
在这里插入图片描述

* 文档

官方文档-pie

五. 箱线图

箱线图不仅可以反映原始数据分布特征,还可以反映多组数据分布特征比较

下图为箱线图的基本构成:
在这里插入图片描述
下四分位数:出现在25%的位置
上四分位数:出现在75%的位置
whis:确定上下界的可调参数,默认为1.5
whisker:箱线图的须
均值为虚线,默认不显示;中位数为实线,默认显示。
异常值:以特殊的形式显示在上下界之外。

函数与参数:
.boxplot(x, sym='b+', vert=True, positions=range(1, N+1), widths=0.5, labels=None, showmean=False, meanline=False)

x             --- 数据
sym           --- 默认'b+'。异常点符号设置。更多属性可设置字典参数:flierprops 
vert          --- 默认TrueFalse水平
whis          --- 默认1.5。决定上下界的参数。即,下界:Q1-whis*(Q3-Q1)
positions     --- 默认range(1, N+1)。设置盒子的位置。
widths        --- 设置盒子的宽度。
labels        --- 设置每个盒子的标签。
showmeans     --- 显示均值为一个点。
meanline      --- 将均值显示为虚线。
notch         --- 默认为False。设置True:则将生成凹口方框图。否则,将生成矩形盒形图。缺口表示中位数周围的置信区间(CI)。有关如何计算槽口位置的信息,请参见“bootstrap”参数的条目。

其他参数:
showcaps : bool, optional (True)
    Show the caps on the ends of whiskers.
    默认显示极值的帽边
showbox : bool, optional (True)
    Show the central box.
    默认显示中间的盒子
showfliers : bool, optional (True)
    Show the outliers beyond the caps.
    默认显示超过极值的异常值
showmeans : bool, optional (False)
    Show the arithmetic means.
    默认不显示均值
capprops : dict, optional (None)
    Specifies the style of the caps.
    设置帽边的属性
boxprops : dict, optional (None)
    Specifies the style of the box.
    设置盒子的属性
whiskerprops : dict, optional (None)
    Specifies the style of the whiskers.
    设置须属性
flierprops : dict, optional (None)
    Specifies the style of the fliers.
    设置异常值属性
medianprops : dict, optional (None)
    Specifies the style of the median.
    设置中值属性
meanprops : dict, optional (None)
    Specifies the style of the mean.
    设置均值属性

例子:

data = np.random.rand(100)*100
# 添加两个异常值
data = np.append(data,np.array([-100,180]))
plt.boxplot(data,sym='r', meanline=True,showmeans=True, vert=False, showcaps=False, whiskerprops={"color":'r'}, notch=True)

结果显示:
在这里插入图片描述

应用场景

  1. 直观明了地识别数据中的异常值。
  2. 利用箱线图判断数据的偏态。
  3. 利用箱线图比较几批数据的形状。
  4. 箱线图适合比较多组数据,如果只是要看一组数据的分布情况,建议使用直方图。

* 文档

官网文档-boxplot

六. 雷达图

函数与参数:
部分参数与.plot函数的参数类似,这里省略,可自行添加
.polar(theta, values, color='b', alpha=None, linewidth=None)

theta              --- 角度序列
values             --- 值序列

例子:

dataLenth = 6   # 数据长度

theta = np.linspace(0,np.pi*2, dataLenth, endpoint=False)  # 设置角度, 去除尾部度数,便于闭合操作
theta = np.concatenate((theta, [theta[0]]))      # 封闭尾部

values1 = [90, 99, 40, 80, 75, 60]                # 设置值1
values1 = np.concatenate((values1, [values1[0]]))   # 封闭尾部

values2 = [110, 108, 79, 85, 70, 60]              # 设置值2
values2 = np.concatenate((values2, [values2[0]]))   # 封闭尾部

subjects = ["语文", "数学", "英语", "物理", "化学", "生物"]

plt.figure(figsize=(8,6))

plt.polar(theta, values1, marker='o', color='r', linewidth=1, alpha=0.5, label='小明')
plt.fill(theta, values1, alpha=0.25, color='y')       # 填充雷达图

plt.polar(theta, values2, marker='o',color='c', linewidth=1, alpha=0.5, label='小强')
plt.fill(theta, values2, alpha=0.25, color='g')       # 填充雷达图


plt.xticks(theta, subjects, fontsize=12)
plt.ylim(0 ,150)   # 设置值范围
# plt.ytick()      # 同理,设置值宽度

plt.legend()

结果显示:
在这里插入图片描述

* 文档

官方文档-polar

七. 折线图

.plot(x, y, linestyle, linewidth, marker, markersize, color, alpha, markeredgecolor, markeredgewidth, markerfacecolor, drawstyle)

markeredgecolor           --- 标记边缘颜色
markeredgewidth           --- 标记边缘宽度
markerfacecolor           --- 标记内部颜色
drawstyle                 --- 绘画风格

部分属性可参考上一篇博文:
matplotlib(一)

* 文档

官方文档-plot
翻译: matplotlib 所有的color、 marker参数

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值