使用matplotlib将点分散添加到箱线图

Wok*_*Wok 13 python matplotlib boxplot

我在这篇文章中看到了这个精彩的箱形图(图2).

一个精彩的盒子图

正如您所看到的,这是一个箱线图,其上叠加了黑点的散布:x索引黑点(按随机顺序),y是感兴趣的变量.我想用Matplotlib做类似的事情,但我不知道从哪里开始.到目前为止,我在网上发现的箱形图并不那么酷,看起来像这样:

通常的箱形图

matplotlib的文档:http: //matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.boxplot

如何着色箱形图:https: //github.com/jbmouret/matplotlib_for_papers#colored-boxes

Kyr*_*bas 21

您正在寻找的是一种向x轴添加抖动的方法.

这样的东西取自这里:

bp = titanic.boxplot(column='age', by='pclass', grid=False)
for i in [1,2,3]:
    y = titanic.age[titanic.pclass==i].dropna()
    # Add some random "jitter" to the x-axis
    x = np.random.normal(i, 0.04, size=len(y))
    plot(x, y, 'r.', alpha=0.2)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

引用链接:

向箱线图添加附加信息的一种方法是覆盖实际数据; 这通常最适合于小型或中型数据系列.当数据密集时,上面使用的一些技巧有助于可视化:

  1. 降低alpha级别以使点部分透明
  2. 沿x轴添加随机"抖动"以避免过度打击

代码如下所示:

import pylab as P
import numpy as np

# Define data
# Define numBoxes

P.figure()

bp = P.boxplot(data)

for i in range(numBoxes):
    y = data[i]
    x = np.random.normal(1+i, 0.04, size=len(y))
    P.plot(x, y, 'r.', alpha=0.2)

P.show()
Run Code Online (Sandbox Code Playgroud)


小智 13

扩展Kyrubas的解决方案并仅使用matplotlib作为绘图部分(有时我很难使用matplotlib格式化pandas图).

from matplotlib import cm
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# initialize dataframe
n = 200
ngroup = 3
df = pd.DataFrame({'data': np.random.rand(n), 'group': map(np.floor, np.random.rand(n) * ngroup)})

group = 'group'
column = 'data'
grouped = df.groupby(group)

names, vals, xs = [], [] ,[]

for i, (name, subdf) in enumerate(grouped):
    names.append(name)
    vals.append(subdf[column].tolist())
    xs.append(np.random.normal(i+1, 0.04, subdf.shape[0]))

plt.boxplot(vals, labels=names)
ngroup = len(vals)
clevels = np.linspace(0., 1., ngroup)

for x, val, clevel in zip(xs, vals, clevels):
    plt.scatter(x, val, c=cm.prism(clevel), alpha=0.4)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 对于Python 3用户,您需要将地图包装在列表中,如下所示:`'group':list(map(np.floor,np.random.rand(n)* ngroup))` (2认同)

HS-*_*ula 10

作为一个更简单、可能更新的选项,您可以使用seaborn'sswarmplot选项。

import seaborn as sns
import matplotlib.pyplot as plt

sns.set(style="whitegrid")
tips = sns.load_dataset("tips")

ax = sns.boxplot(x="day", y="total_bill", data=tips, showfliers = False)
ax = sns.swarmplot(x="day", y="total_bill", data=tips, color=".25")

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


再次查看原始问题(并且自己有更多经验),我认为而不是sns.swarmplot,sns.stripplot会更准确。

  • 是的,即使使用群图处理数千个数据点,计算机也会挂起 4ever。 (2认同)