Matplotlib学习---用seaborn画联合分布图(joint plot)

博客介绍利用《Python数据科学手册》中的马拉松数据绘制联合分布图,查看半程和全程时间分布情况。需将时间转换为秒,通过代码绘制出图。从图中可知大部分人后半程比前半程慢,设置kind参数为reg还会显示拟合线。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时我们不仅需要查看单个变量的分布,同时也需要查看变量之间的联系,这时就需要用到联合分布图。

 

这里利用Jake Vanderplas所著的《Python数据科学手册》一书中的数据,学习画图。

 

数据地址:http://raw.githubusercontent.com/jakevdp/marathon-data/master/marathon-data.csv

 

先来看一下这个数据文件(此处只摘取部分):

       age gender     split     final
0       33      M  01:05:38  02:08:51
1       32      M  01:06:26  02:09:28
2       31      M  01:06:49  02:10:42
3       38      M  01:06:16  02:13:45
4       31      M  01:06:32  02:13:59
5       31      M  01:06:13  02:14:11
6       27      M  01:06:40  02:14:28
7       31      M  01:06:31  02:15:16
8       30      M  01:05:39  02:15:57
9       30      M  01:05:40  02:16:39
10      26      M  01:08:10  02:18:18
   ...    ...       ...       ...
37220   52      M  03:20:00  08:46:04
37221   53      M  03:40:34  08:46:39
37222   60      M  03:39:16  08:46:48
37223   57      M  03:47:08  08:46:58
37224   61      M  03:32:20  08:47:25
37225   41      M  03:43:25  08:49:12
37226   24      M  03:34:01  08:49:36
37227   79      M  03:28:31  08:49:46
37228   24      W  03:35:21  08:50:47
37229   60      W  03:49:33  08:50:58
37230   50      W  03:43:48  08:52:14

这个数据展示的是各年龄和性别的人跑马拉松比赛所用的时间(半程split和全程final)。

 

让我们来画一个联合分布图,看一下半程和全程时间的分布情况。

 

联合分布图: sns.jointplot(x,y,data=...,kind=...)

 

这里需要对数据做的处理工作是把半程和全程的时间转换成秒,因为时间的格式是固定的,因此写了一个用于时间转换的helper function。

 

代码如下:

import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
marathon=pd.read_csv(r"http://raw.githubusercontent.com/jakevdp/marathon-data/master/marathon-data.csv")

marathon["split"]=marathon["split"].astype(str)
marathon["final"]=marathon["final"].astype(str)

def convert_time_to_sec(time):
    """convert hh:mm:ss to seconds"""
    hour=int(time[:2])
    minute=int(time[3:5])
    sec=int(time[6:])
    total_sec=hour*3600+minute*60+sec
    return total_sec

marathon["split_sec"]=[convert_time_to_sec(i) for i in marathon["split"]]
marathon["final_sec"]=[convert_time_to_sec(i) for i in marathon["final"]]

sns.jointplot("split_sec","final_sec",data=marathon)

plt.show()

 

图像如下:

可以看出,如果数据点位于对角线上,说明半程所用的时间正好是全程的一半。但是,大部分数据点都位于对角线上方,这说明大部分人后半程用的时间要比前半程多,也就是越跑越慢。

 

此外,如果将kind参数设置为reg,图像还会显示拟合线。

 

转载于:https://www.cnblogs.com/HuZihu/p/9522466.html

### 使用 Seaborn 绘制多个统计分布图 为了实现这一目标,可以利用 `pairplot()` 函数来绘制多变量间的不同类型的图表组合。`pairplot()` 是一种便捷的方式,能够一次性展示数据集内各数值型字段间的关系。 对于散点图而言,Seaborn 提供了直观的方式来呈现两个连续变量之间的关系[^1]: ```python import seaborn as sns import matplotlib.pyplot as plt # 加载内置鸢尾花数据集作为例子 iris = sns.load_dataset('iris') # 创建散点图矩阵 sns.pairplot(iris, diag_kind='hist') plt.show() ``` 上述代码不仅限于简单的散点图;通过设置参数 `diag_kind='kde'` 可以让对角线上显示核密度估计(KDE),而其他位置保持为默认的散点形式[^4]。 如果希望进一步定制化图形,比如加入回归线或是改变颜色映射,则可以通过调整更多选项完成复杂需求。下面的例子展示了带有回归线的散点图以及使用调色板定义的颜色方案[^2]: ```python # 自定义 pairplot 的样式 g = sns.pairplot( iris, hue="species", # 颜色分类依据 palette="husl", markers=["o", "s", "D"], # 不同类别标记形状 plot_kws=dict(s=50, edgecolor="b", linewidth=1), # 散点属性配置 ) # 添加回归线到非对角子图中 for ax in g.axes.flat: if not isinstance(ax.collections[0], mpl.collections.PathCollection): continue sns.regplot(x=ax.get_xlabel(), y=ax.get_ylabel(), data=iris, scatter=False, color=".2", ax=ax) plt.show() ``` 除了 `pairplot()` 外,还可以单独针对特定列之间构建更复杂的联合分布视图,如结合直方图、KDE 曲线等多种元素于一体[^3]。 ```python tips = sns.load_dataset("tips") # 构建更加丰富的双变量分布图 with sns.axes_style("white"): g = sns.jointplot( x=tips["total_bill"], y=tips["tip"], kind="hex", # 或者尝试 'scatter', 'reg', 'resid' marginal_ticks=True, joint_kws=dict(gridsize=20), marginal_kws=dict(bins=15, fill=True), ) g.plot_marginals(sns.rugplot, height=-.02, color="r") # 在边缘添加细条带表示观测值的位置 plt.show() ``` 以上方法提供了多种途径去探索和表达数据内部结构及其相互联系,适用于不同的应用场景下进行深入的数据洞察工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值