【问题标题】:How to plot 1d scatterplots by category/ or add points over a boxplot如何按类别绘制一维散点图/或在箱线图上添加点
【发布时间】:2020-10-28 22:36:14
【问题描述】:

我目前使用 pandas 从数据库中读取数据来实现这个箱线图。

我的例子是:

import pandas as pd
import numpy as np
import pymysql
import matplotlib.pyplot as plt

experiments = ['exp1', 'exp2', 'exp3']
test_data = pd.DataFrame({ "value":np.random.normal(0.8,0.2,20)} )
test_data["name"] = np.random.choice(experiments, size=20)

test_data.boxplot(column='value', by='name', figsize=(15,12))

不过,这并不是我想要的,我真的想以散点的形式显示图表上的所有点。

在另一个问题中找到了我想要的输出示例,但我缺乏将其正确应用到格式不同的数据框的技能....:

data = pd.DataFrame({ "A":np.random.normal(0.8,0.2,20),
                      "B":np.random.normal(0.8,0.1,20), 
                      "C":np.random.normal(0.9,0.1,20)} )

data.boxplot()

for i,d in enumerate(data):
    y = data[d]
    x = np.random.normal(i+1, 0.04, len(y))
    plt.plot(x, y, mfc = ["orange","blue","yellow"][i], mec='k', ms=7, marker="o", linestyle="None")

plt.hlines(1,0,4,linestyle="--")

任何帮助将不胜感激。

【问题讨论】:

标签: pandas matplotlib scatter-plot boxplot


【解决方案1】:

这样的事情会起作用:

test_data.boxplot(column='value', by='name', figsize=(15,12))

for i, (k,d) in enumerate(test_data.groupby('name')):
    y = d['value']
    x = np.random.normal(i+1, 0.04, len(y))
    plt.plot(x, y, mfc = ["orange","blue","yellow"][i], mec='k', ms=7, marker="o", linestyle="None")

输出:

【讨论】:

  • 通常认为数据可视化的视觉元素由(甚至种子)随机数生成是一种不好的做法。
  • 带有np.random.normal(i+1, 0.04, len(y)) 的代码只是将抖动添加到点,以便它们在水平方向上可以视觉区分并且不会聚集在一起。所以应该没问题
猜你喜欢
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2015-06-29
  • 2016-07-12
  • 2022-07-28
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
相关资源
最近更新 更多