【数据可视化01】matplotlib实例3之数据统计

目录

  • 一、引言
  • 二、实例介绍
      • 1.百分位数为横条形图
      • 2.箱线图定制化
      • 3.带有自定义填充颜色的箱线图
      • 4.箱线图
      • 5.箱线图和小提琴图
      • 6.二维数据集的置信椭圆

一、引言

matplotlib库 可以用来创建各种静态、动态、交互式的图形,并广泛应用于数据分析和数据可视化领域。

二、实例介绍

1.百分位数为横条形图
2.箱线图定制化
3.带有自定义填充颜色的箱线图
4.箱线图
5.箱线图和小提琴图
6.二维数据集的置信椭圆

1.百分位数为横条形图

  条形图对于可视化计数或带有误差条的汇总统计数据很有用。本例来自一个应用程序,在这个应用程序中,小学体育老师希望能够向家长展示他们的孩子在一些健身测试中的表现。绘图代码如下:

from collections import namedtupleimport matplotlib.pyplot as plt
import numpy as npStudent = namedtuple('Student', ['name', 'grade', 'gender'])
Score = namedtuple('Score', ['value', 'unit', 'percentile'])def to_ordinal(num):"""Convert an integer to an ordinal string, e.g. 2 -> '2nd'."""suffixes = {str(i): vfor i, v in enumerate(['th', 'st', 'nd', 'rd', 'th','th', 'th', 'th', 'th', 'th'])}v = str(num)# special case early teensif v in {'11', '12', '13'}:return v + 'th'return v + suffixes[v[-1]]def format_score(score):"""Create score labels for the right y-axis as the test name followed by themeasurement unit (if any), split over two lines."""return f'{score.value}\n{score.unit}' if score.unit else str(score.value)def plot_student_results(student, scores_by_test, cohort_size):fig, ax1 = plt.subplots(figsize=(9, 7), layout='constrained')fig.canvas.manager.set_window_title('Eldorado K-8 Fitness Chart')ax1.set_title(student.name)ax1.set_xlabel('Percentile Ranking Across {grade} Grade {gender}s\n''Cohort Size: {cohort_size}'.format(grade=to_ordinal(student.grade),gender=student.gender.title(),cohort_size=cohort_size))test_names = list(scores_by_test.keys())percentiles = [score.percentile for score in scores_by_test.values()]rects = ax1.barh(test_names, percentiles, align='center', height=0.5)# Partition the percentile values to be able to draw large numbers in# white within the bar, and small numbers in black outside the bar.large_percentiles = [to_ordinal(p) if p > 40 else '' for p in percentiles]small_percentiles = [to_ordinal(p) if p <= 40 else '' for p in percentiles]ax1.bar_label(rects, small_percentiles,padding=5, color='black', fontweight='bold')ax1.bar_label(rects, large_percentiles,padding=-32, color='white', fontweight='bold')ax1.set_xlim([0, 100])ax1.set_xticks([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100])ax1.xaxis.grid(True, linestyle='--', which='major',color='grey', alpha=.25)ax1.axvline(50, color='grey', alpha=0.25)  # median position# Set the right-hand Y-axis ticks and labelsax2 = ax1.twinx()# Set equal limits on both yaxis so that the ticks line upax2.set_ylim(ax1.get_ylim())# Set the tick locations and labelsax2.set_yticks(np.arange(len(scores_by_test)),labels=[format_score(score) for score in scores_by_test.values()])ax2.set_ylabel('Test Scores')student = Student(name='Johnny Doe', grade=2, gender='Boy')
scores_by_test = {'Pacer Test': Score(7, 'laps', percentile=37),'Flexed Arm\n Hang': Score(48, 'sec', percentile=95),'Mile Run': Score('12:52', 'min:sec', percentile=73),'Agility': Score(17, 'sec', percentile=60),'Push Ups': Score(14, '', percentile=16),
}plot_student_results(student, scores_by_test, cohort_size=62)
plt.show()

在这里插入图片描述

2.箱线图定制化

  这个示例演示了如何使用各种关键字参数来完全自定义框图。第一个图演示了如何删除和添加单个组件(注意,平均值是默认情况下唯一未显示的值)。第二张图展示了如何定制艺术家的风格。它还演示了如何将晶须的限制设置为特定的百分位数(右下轴)。关于箱形图及其历史的一个很好的一般参考资料可以在这里找到: https://vita.had.co.nz/papers/boxplots.pdf

import matplotlib.pyplot as plt
import numpy as np# fake data
np.random.seed(19680801)
data = np.random.lognormal(size=(37, 4), mean=1.5, sigma=1.75)
labels = list('ABCD')
fs = 10  # fontsize
fig, axs = plt.subplots(nrows=2, ncols=3, figsize=(6, 6), sharey=True)
axs[0, 0].boxplot(data, labels=labels)
axs[0, 0].set_title('Default', fontsize=fs)axs[0, 1].boxplot(data, labels=labels, showmeans=True)
axs[0, 1].set_title('showmeans=True', fontsize=fs)axs[0, 2].boxplot(data, labels=labels, showmeans=True, meanline=True)
axs[0, 2].set_title('showmeans=True,\nmeanline=True', fontsize=fs)axs[1, 0].boxplot(data, labels=labels, showbox=False, showcaps=False)
tufte_title = 'Tufte Style \n(showbox=False,\nshowcaps=False)'
axs[1, 0].set_title(tufte_title, fontsize=fs)axs[1, 1].boxplot(data, labels=labels, notch=True, bootstrap=10000)
axs[1, 1].set_title('notch=True,\nbootstrap=10000', fontsize=fs)axs[1, 2].boxplot(data, labels=labels, showfliers=False)
axs[1, 2].set_title('showfliers=False', fontsize=fs)for ax in axs.flat:ax.set_yscale('log')ax.set_yticklabels([])fig.subplots_adjust(hspace=0.4)
plt.show()

结果如下图所示,演示如何切换不同元素的显示:
在这里插入图片描述

演示如何自定义显示不同的元素:

import matplotlib.pyplot as plt
import numpy as np# fake data
np.random.seed(19680801)
data = np.random.lognormal(size=(37, 4), mean=1.5, sigma=1.75)
labels = list('ABCD')
fs = 10  # fontsizeboxprops = dict(linestyle='--', linewidth=3, color='darkgoldenrod')
flierprops = dict(marker='o', markerfacecolor='green', markersize=12,markeredgecolor='none')
medianprops = dict(linestyle='-.', linewidth=2.5, color='firebrick')
meanpointprops = dict(marker='D', markeredgecolor='black',markerfacecolor='firebrick')
meanlineprops = dict(linestyle='--', linewidth=2.5, color='purple')fig, axs = plt.subplots(nrows=2, ncols=3, figsize=(6, 6), sharey=True)
axs[0, 0].boxplot(data, boxprops=boxprops)
axs[0, 0].set_title('Custom boxprops', fontsize=fs)axs[0, 1].boxplot(data, flierprops=flierprops, medianprops=medianprops)
axs[0, 1].set_title('Custom medianprops\nand flierprops', fontsize=fs)axs[0, 2].boxplot(data, whis=(0, 100))
axs[0, 2].set_title('whis=(0, 100)', fontsize=fs)axs[1, 0].boxplot(data, meanprops=meanpointprops, meanline=False,showmeans=True)
axs[1, 0].set_title('Custom mean\nas point', fontsize=fs)axs[1, 1].boxplot(data, meanprops=meanlineprops, meanline=True,showmeans=True)
axs[1, 1].set_title('Custom mean\nas line', fontsize=fs)axs[1, 2].boxplot(data, whis=[15, 85])
axs[1, 2].set_title('whis=[15, 85]\n#percentiles', fontsize=fs)for ax in axs.flat:ax.set_yscale('log')ax.set_yticklabels([])fig.suptitle("I never said they'd be pretty")
fig.subplots_adjust(hspace=0.4)
plt.show()

在这里插入图片描述

3.带有自定义填充颜色的箱线图

  该图说明了如何创建两种类型的框图(矩形和缺口),以及如何通过访问框图的艺术家的属性来使用自定义颜色填充它们。此外,labels参数用于为每个样本提供x-tick标签。

import matplotlib.pyplot as plt
import numpy as np# Random test data
np.random.seed(19680801)
all_data = [np.random.normal(0, std, size=100) for std in range(1, 4)]
labels = ['x1', 'x2', 'x3']fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(9, 4))# rectangular box plot
bplot1 = ax1.boxplot(all_data,vert=True,  # vertical box alignmentpatch_artist=True,  # fill with colorlabels=labels)  # will be used to label x-ticks
ax1.set_title('Rectangular box plot')# notch shape box plot
bplot2 = ax2.boxplot(all_data,notch=True,  # notch shapevert=True,  # vertical box alignmentpatch_artist=True,  # fill with colorlabels=labels)  # will be used to label x-ticks
ax2.set_title('Notched box plot')# fill with colors
colors = ['pink', 'lightblue', 'lightgreen']
for bplot in (bplot1, bplot2):for patch, color in zip(bplot['boxes'], colors):patch.set_facecolor(color)# adding horizontal grid lines
for ax in [ax1, ax2]:ax.yaxis.grid(True)ax.set_xlabel('Three separate samples')ax.set_ylabel('Observed values')plt.show()

在这里插入图片描述

4.箱线图

  使用matplotlib可视化箱线图。
下面的示例展示了如何使用Matplotlib可视化箱线图。有许多选项可以控制它们的外观和用于汇总数据的统计信息。

import matplotlib.pyplot as plt
import numpy as npfrom matplotlib.patches import Polygon# Fixing random state for reproducibility
np.random.seed(19680801)# fake up some data
spread = np.random.rand(50) * 100
center = np.ones(25) * 50
flier_high = np.random.rand(10) * 100 + 100
flier_low = np.random.rand(10) * -100
data = np.concatenate((spread, center, flier_high, flier_low))fig, axs = plt.subplots(2, 3)# basic plot
axs[0, 0].boxplot(data)
axs[0, 0].set_title('basic plot')# notched plot
axs[0, 1].boxplot(data, 1)
axs[0, 1].set_title('notched plot')# change outlier point symbols
axs[0, 2].boxplot(data, 0, 'gD')
axs[0, 2].set_title('change outlier\npoint symbols')# don't show outlier points
axs[1, 0].boxplot(data, 0, '')
axs[1, 0].set_title("don't show\noutlier points")# horizontal boxes
axs[1, 1].boxplot(data, 0, 'rs', 0)
axs[1, 1].set_title('horizontal boxes')# change whisker length
axs[1, 2].boxplot(data, 0, 'rs', 0, 0.75)
axs[1, 2].set_title('change whisker length')fig.subplots_adjust(left=0.08, right=0.98, bottom=0.05, top=0.9,hspace=0.4, wspace=0.3)# fake up some more data
spread = np.random.rand(50) * 100
center = np.ones(25) * 40
flier_high = np.random.rand(10) * 100 + 100
flier_low = np.random.rand(10) * -100
d2 = np.concatenate((spread, center, flier_high, flier_low))
# Making a 2-D array only works if all the columns are the
# same length.  If they are not, then use a list instead.
# This is actually more efficient because boxplot converts
# a 2-D array into a list of vectors internally anyway.
data = [data, d2, d2[::2]]# Multiple box plots on one Axes
fig, ax = plt.subplots()
ax.boxplot(data)plt.show()

在这里插入图片描述

5.箱线图和小提琴图

  小提琴图与箱形图密切相关,它们都添加了有用的信息,如样本数据的分布(密度迹)。默认情况下,箱形图显示1.5 *四分位数范围以外的数据点,小提琴图要求matplotlib >= 1.4。

import matplotlib.pyplot as plt
import numpy as npfig, axs = plt.subplots(nrows=1, ncols=2, figsize=(9, 4))# Fixing random state for reproducibility
np.random.seed(19680801)# generate some random test data
all_data = [np.random.normal(0, std, 100) for std in range(6, 10)]# plot violin plot
axs[0].violinplot(all_data,showmeans=False,showmedians=True)
axs[0].set_title('Violin plot')# plot box plot
axs[1].boxplot(all_data)
axs[1].set_title('Box plot')# adding horizontal grid lines
for ax in axs:ax.yaxis.grid(True)ax.set_xticks([y + 1 for y in range(len(all_data))],labels=['x1', 'x2', 'x3', 'x4'])ax.set_xlabel('Four separate samples')ax.set_ylabel('Observed values')plt.show()

在这里插入图片描述

6.二维数据集的置信椭圆

如何使用pearson相关系数绘制二维数据集的置信椭圆。这里解释并证明了用来获得正确几何图形的方法 https://carstenschelp.github.io/2018/09/14/Plot_Confidence_Ellipse_001.html.
该方法避免了使用迭代特征分解算法,并利用了归一化协方差矩阵(由pearson相关系数和1组成)特别易于处理的事实。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Ellipse
import matplotlib.transforms as transforms

绘图函数本身
这个函数绘制给定的类数组变量x和y的协方差的置信椭圆。椭圆被绘制到给定的轴-对象ax中。
椭圆的半径可以通过n_std来控制,这是标准偏差的数量。默认值为3,如果数据像这些示例中一样呈正态分布,则椭圆将包含98.9%的点(1-D中的3个标准差包含99.7%的数据,这是2-D中的98.9%的数据)。

def confidence_ellipse(x, y, ax, n_std=3.0, facecolor='none', **kwargs):"""Create a plot of the covariance confidence ellipse of *x* and *y*.Parameters----------x, y : array-like, shape (n, )Input data.ax : matplotlib.axes.AxesThe axes object to draw the ellipse into.n_std : floatThe number of standard deviations to determine the ellipse's radiuses.**kwargsForwarded to `~matplotlib.patches.Ellipse`Returns-------matplotlib.patches.Ellipse"""if x.size != y.size:raise ValueError("x and y must be the same size")cov = np.cov(x, y)pearson = cov[0, 1]/np.sqrt(cov[0, 0] * cov[1, 1])# Using a special case to obtain the eigenvalues of this# two-dimensional dataset.ell_radius_x = np.sqrt(1 + pearson)ell_radius_y = np.sqrt(1 - pearson)ellipse = Ellipse((0, 0), width=ell_radius_x * 2, height=ell_radius_y * 2,facecolor=facecolor, **kwargs)# Calculating the standard deviation of x from# the squareroot of the variance and multiplying# with the given number of standard deviations.scale_x = np.sqrt(cov[0, 0]) * n_stdmean_x = np.mean(x)# calculating the standard deviation of y ...scale_y = np.sqrt(cov[1, 1]) * n_stdmean_y = np.mean(y)transf = transforms.Affine2D() \.rotate_deg(45) \.scale(scale_x, scale_y) \.translate(mean_x, mean_y)ellipse.set_transform(transf + ax.transData)return ax.add_patch(ellipse)

创建相关数据集的辅助函数
创建具有指定二维平均值(mu)和维度(scale)的随机二维数据集。相关性可以通过参数“依赖性”(一个2x2矩阵)来控制。

def get_correlated_dataset(n, dependency, mu, scale):latent = np.random.randn(n, 2)dependent = latent.dot(dependency)scaled = dependent * scalescaled_with_offset = scaled + mu# return x and y of the new, correlated datasetreturn scaled_with_offset[:, 0], scaled_with_offset[:, 1]

正、负、弱相关
请注意,弱相关性的形状(右)是椭圆形,而不是圆形,因为x和y的比例不同。然而,x和y不相关的事实是,椭圆的轴线与坐标系的x轴和y轴对齐。

np.random.seed(0)PARAMETERS = {'Positive correlation': [[0.85, 0.35],[0.15, -0.65]],'Negative correlation': [[0.9, -0.4],[0.1, -0.6]],'Weak correlation': [[1, 0],[0, 1]],
}mu = 2, 4
scale = 3, 5fig, axs = plt.subplots(1, 3, figsize=(9, 3))
for ax, (title, dependency) in zip(axs, PARAMETERS.items()):x, y = get_correlated_dataset(800, dependency, mu, scale)ax.scatter(x, y, s=0.5)ax.axvline(c='grey', lw=1)ax.axhline(c='grey', lw=1)confidence_ellipse(x, y, ax, edgecolor='red')ax.scatter(mu[0], mu[1], c='red', s=3)ax.set_title(title)plt.show()

完整代码运行之后,图形显示如下:
在这里插入图片描述
E N D ! \color{#4285f4}{\mathbf{E}}\color{#ea4335}{\mathbf{N}}\color{#fbbc05}{\mathbf{D}}\color{#4285f4}{\mathbf{!}} END!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贷款中介CRM管理系统解决方案

一、贷款中介行业背景介绍 随着贷款中介行业的快速发展&#xff0c;贷款中介业务逐渐成为企业和个人融资的重要渠道。然而&#xff0c;贷款中介行业存在信息不对称、风险控制不力等难题。给金融稳定带来潜在风险。 二、方案目的和意义 鑫鹿贷款中介系统解决方案旨在规范贷款中…

Elasticsearch查看集群信息,设置ES密码,Kibana部署

Elasticsearch查看集群信息&#xff0c;设置ES密码&#xff0c;Kibana部署 查看集群信息查看节点信息查看集群健康状态查看分片信息查看其他集群信息 Kibana部署安装设置ES密码 查看集群信息 查看节点信息 curl http://127.0.0.1:9200/_cat/nodes?v 参数说明&#xff1a; ip…

研究生学习---找工作

规划 研一~研二上学期完成小论文&#xff0c;实习&#xff0c;秋招 竞赛&#xff1a;kaggle&#xff1f; 面试题一般简单且为原题&#xff0c;笔试题目很难&#xff0c;不会出原题 项目 找工作软件

SwiftUI中三大渐变色的介绍

在SwiftUI中&#xff0c;渐变色是一种常用的视觉效果&#xff0c;用于创建平滑过渡的颜色变化。通过使用渐变色&#xff0c;我们可以实现丰富多彩的界面设计&#xff0c;增强用户体验。 1. 渐变色的种类和用途 种类&#xff1a; 线性渐变&#xff08;Linear Gradient&#x…

【时隙ALOHA,CSMA(载波侦听多路访问)carrier sense mltiple access,无线局域网: CSMA/CA】

文章目录 时隙ALOHA时隙ALOHA的效率( Efficiency )纯ALOHA(非时隙)----效率低CSMA(载波侦听多路访问)carrier sense mltiple accessCSMA冲突CSMA/CD(冲突检测)边说边听&#xff08;提高了信道利用率&#xff09;以太网就是用的这个无线局域网: CSMA/CA无线局域网中的 MAC&#…

Transformer+Classification学习笔记

论文名称&#xff1a;An Image is Worth 16x16 Words:Transformers for Image Recognition at Scale [2112.11010] MPViT: Multi-Path Vision Transformer for Dense Prediction (arxiv.org) 参考博客与视频&#xff1a; Vision Transformer 超详细解读 (原理分析代码解读) …

2024年了,Covid19怎么发?PANoptosis程序性死亡,抓紧上车!

说在前面 大家众所周知的新冠&#xff0c;其实早在19年末&#xff0c;20年初的时候很多人都抓住了这个热点发到了好文章&#xff0c;Covid-19&#xff0c;这玩意可以做到让一个期刊从2分飙升到20分&#xff0c;且非预警期刊&#xff0c;不过现在退火了&#xff0c;今年是12.7分…

数据结构(十四)----排序算法(1)

目录 一.排序的基本概念 二.插入排序 1.直接插入排序 2.折半插入排序 三.希尔排序&#xff08;Shell Sort&#xff09; 四.交换排序 1.冒泡排序 2.快速排序 快速排序算法的效率&#xff1a; 快速排序算法的稳定性&#xff1a; 这一篇博客的重点主要是快速排序&#x…

2024小红书电商实战营,养号打造IP/选爆品/开店铺/爆款笔记/等等(24节)

我们非常荣幸地为大家带来2024小红书电商实战营的第一期&#xff0c;在这里我们将带领大家一起深入学习如何利用小红书平台&#xff0c;实现个人品牌的发展和商业利益的增长。 首先&#xff0c;我们将讨论养号的重要性以及如何打造个人品牌。无论是建立自己的受众群体还是提高…

微信小程序知识点归纳(一)

前言&#xff1a;适用于有一定基础的前端开发同学&#xff0c;完成从网页开发到小程序开发的知识转换。 先立框架&#xff0c;后砌墙壁 回顾&#xff1a;了解微信小程序开发流程-CSDN博客 初始页面结构&#xff0c;三部分pages、utils、配置&#xff0c;分别存放页面、工具类…

【解决】Unity Build 应用程序运行即崩溃问题

开发平台&#xff1a;Unity 2021.3.7f1c1   一、问题描述 编辑器 Build 工程结束&#xff0c;但控制台 未显示 Build completed with a result of Succeeded [时间长度] 信息。该情况下打包流程正常&#xff0c;但应用程序包打开即崩溃。   二、问题测试记录 测试1&#xf…

百面算法工程师 | 传统图像处理——OpenCV

本文给大家带来的百面算法工程师是传统图像处理的面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们将总结一些几何变换和图像平滑处理&#xff0c;并提供参考的回答及其理论基础&#…

C++自定义日期类的精彩之旅(详解)

在学习了C的6个默认成员函数后&#xff0c;我们现在动手实现一个完整的日期类&#xff0c;来加强对这6个默认成员函数的认识。 这是日期类中所包含的成员函数和成员变量&#xff1a; 构造函数 // 函数&#xff1a;获取某年某月的天数 inline int GetMonthDay(int yea…

常见磁盘分区问题

给磁盘分区有几个主要的原因&#xff1a; 组织和管理数据&#xff1a;分区可以帮助用户更好地组织和管理数据。例如&#xff0c;你可以在一个分区上安装操作系统&#xff0c;而在另一个分区上存储个人文件。这样&#xff0c;即使操作系统崩溃或需要重新安装&#xff0c;你的个…

Docker 使用 Fedora 镜像

Fedora 在 Docker 中的使用也非常简单&#xff0c;直接使用命令 docker run -it fedora:latest bash 就可以 pull 到本地的容器中并且运行。 C:\Users\yhu>docker run -it fedora:latest bash Unable to find image fedora:latest locally latest: Pulling from library/fed…

【瑞萨RA6M3】2. UART 实验

https://blog.csdn.net/qq_35181236/article/details/132789258 使用 uart9 配置 打印 void hal_entry(void) {/* TODO: add your own code here */fsp_err_t err;uint8_t c;/* 配置串口 */err g_uart9.p_api->open(g_uart9.p_ctrl, g_uart9.p_cfg);while (1){g_uart9.…

mysql的隔离性——MVCC

MVCC通过undolog版本链和readview来实现 更新和删除时会写入undolog中。 读已提交&#xff1a;在事务任意读时创建readview&#xff0c;读最新提交的事务 可重复读&#xff1a;在事务第一次读时创建readview

使用Caché管理工具

Cach通过一个web工具来对其进行系统管理和完成管理任务,该方法的一个好处是不必将Cach安装到用于管理的系统上。目前,通过网络远程管理和控制对站点的访问,这些都比较容易。因为数据及其格式信息都直接来自被管理的系统,因此,这也可以最小化跨版本的兼容问题。 本文将描述…

Kubernetes二进制(单master)部署

文章目录 Kubernetes二进制&#xff08;单master&#xff09;部署一、常见的K8S部署方式1. Minikube2. Kubeadmin3. 二进制安装部署4. 小结 二、K8S单&#xff08;Master&#xff09;节点二进制部署1. 环境准备1.1 服务器配置1.2 关闭防火墙1.3 修改主机名1.4 关闭swap1.5 在/e…