使用Python绘制数据箱线图遇报错及空图问题求助
解决箱线图绘制的两个问题:维度错误与空图问题
问题1:ValueError: X must have 2 or fewer dimensions 的原因
你最初的代码里,ran_yes 和 ran_no 是筛选后的整个DataFrame(包含所有列),而plt.boxplot()需要的是一维的数值数据(比如单一列的Series或数组)。直接把整个DataFrame传入,会导致维度不符合要求,触发报错。
问题2:空图的原因
修改后的代码里,subset = pulserate[(pulserate["Ran"] == "yes") & (pulserate["Ran"] == "no")] 逻辑错误:一行数据的Ran列不可能同时等于"yes"和"no",所以subset是空的DataFrame,绘制出来自然是空图。
正确的解决方法
假设你要绘制的是某一数值列(比如脉搏率列,假设列名为Pulse)按Ran分组的箱线图,以下是两种可行方案:
方案1:使用matplotlib手动整理数据
明确提取需要绘制的数值列,将其转为一维数组后传入plt.boxplot():
import matplotlib.pyplot as plt import pandas as pd pulserate = pd.read_csv("PulseNew.csv") # 提取需要的数值列(替换成你实际要绘制的列名,比如"Pulse") ran_yes_pulse = pulserate[pulserate["Ran"] == "yes"]["Pulse"] ran_no_pulse = pulserate[pulserate["Ran"] == "no"]["Pulse"] # 传入一维数据 plt.boxplot([ran_yes_pulse, ran_no_pulse]) # 添加标签让图表更清晰 plt.xticks([1, 2], ["Ran=yes", "Ran=no"]) plt.ylabel("Pulse Rate") plt.title("Pulse Rate Distribution by Ran Status") plt.show()
方案2:使用pandas自带的箱线图方法(更简洁)
pandas的DataFrame内置了boxplot()方法,可以直接按分组列绘制,无需手动拆分数据:
import pandas as pd import matplotlib.pyplot as plt pulserate = pd.read_csv("PulseNew.csv") # 按"Ran"列分组,绘制"Pulse"列的箱线图 pulserate.boxplot(column="Pulse", by="Ran") plt.title("Pulse Rate Distribution by Ran Status") plt.suptitle("") # 移除pandas自动添加的标题 plt.show()
注意事项
- 确保你使用的数值列(比如示例中的
Pulse)确实存在于你的CSV文件中,替换成你实际需要分析的列名。 - 如果CSV中有缺失值,可以先用
dropna()处理,比如pulserate = pulserate.dropna(subset=["Pulse", "Ran"]),避免绘制时出现问题。
内容的提问来源于stack exchange,提问作者Samuel S. Edme
相关产品推荐
相关产品推荐

