将R中ggplot2箱线图+散点图迁移至Python的实现问题
R ggplot2箱线图迁移至Python的实现方案
错误原因
你之前的代码报错是因为Seaborn将x=0解析为布尔值(Python中0等价于False),而非像R ggplot2那样将其作为常量映射到x轴。Seaborn内部判断变量类型时,尝试对布尔值调用.all()方法,导致抛出AttributeError: 'bool' object has no attribute 'all'。
正确实现方式
方案1:使用Seaborn实现
通过为数据添加统一分组列替代直接传入数值0,利用scatterplot的hue和style参数实现按a_class区分颜色和形状,模拟R中geom_jitter的效果:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 构造数据 df1 = pd.DataFrame({ "a_class": list("abcdefghij"), "vals": [1,2,3,4,5,6,7,8,9,10] }) # 添加统一的x分组列 df1['x_group'] = '' plt.figure(figsize=(6, 8)) # 绘制箱线图 sns.boxplot(x='x_group', y='vals', data=df1) # 绘制带x方向抖动的散点,按a_class区分颜色和形状 sns.scatterplot( x='x_group', y='vals', data=df1, hue='a_class', style='a_class', s=100, jitter=0.2, # 控制x方向抖动幅度 legend='full' ) # 隐藏x轴的标题、刻度和标签 plt.xlabel('') plt.xticks([]) # 调整图例位置避免遮挡图表 plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.show()
方案2:使用Matplotlib原生实现
如果需要更精细的控制,可直接用Matplotlib绘制箱线图和散点:
import pandas as pd import matplotlib.pyplot as plt import numpy as np from matplotlib.lines import Line2D # 构造数据 df1 = pd.DataFrame({ "a_class": list("abcdefghij"), "vals": [1,2,3,4,5,6,7,8,9,10] }) plt.figure(figsize=(6, 8)) # 绘制箱线图,指定x轴位置为0 plt.boxplot(df1['vals'], positions=[0]) # 定义不同形状的标记(选取10种不同形状) markers = [m for m in Line2D.markers.keys() if m not in [None, 'None', '', ' ', '.', ',', '_', '|']][:10] # 定义颜色映射 colors = plt.cm.Set1(np.linspace(0, 1, 10)) # 逐个绘制带抖动的散点 for idx, (cls, val) in enumerate(zip(df1['a_class'], df1['vals'])): # x方向添加随机抖动 x_pos = 0 + np.random.uniform(-0.2, 0.2) plt.scatter( x_pos, val, marker=markers[idx], color=colors[idx], s=100, label=cls ) # 隐藏x轴元素 plt.xlabel('') plt.xticks([]) plt.ylabel('vals') # 添加图例 plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left') plt.show()
内容的提问来源于stack exchange,提问作者Fabrizio
相关产品推荐
相关产品推荐

