根据修改过的代码,再结合# -*- coding: utf-8 -*- """stress-Cu.xlsx数据清洗与可视化""" import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy import stats from sklearn.preprocessing import StandardScaler # ==================== 数据加载 ==================== def load_data(): # 读取Excel文件(假设数据存储在第一个工作表) df = pd.read_excel('stress-Cu.xlsx', sheet_name=0, engine='openpyxl') # 验证数据维度(700行×4列×24维度可能需要检查实际数据结构) print(f"原始数据维度:{df.shape}") # 预期输出应为(700, 24×4)或其他合理结构[^1] print("前两行数据预览:\n", df.head(2)) return df # ==================== 数据清洗 ==================== def clean_data(df): # 缺失值处理(保留至少50%有效数据的列) missing_threshold = df.shape[0] * 0.5 df_clean = df.dropna(axis=1, thresh=missing_threshold) # 中位数填充剩余缺失值[^2] df_clean = df_clean.fillna(df_clean.median()) # 异常值处理(Z-score过滤) z_scores = np.abs(stats.zscore(df_clean)) df_clean = df_clean[(z_scores < 3).all(axis=1)] # 保留3σ内数据[^3] # 删除重复值 df_,
时间: 2025-06-06 11:35:41 浏览: 18
<think>好的,我现在需要解决用户在Python数据清洗与可视化中遇到的关于seaborn和matplotlib的字体警告问题。用户提到的错误是UserWarning: Glyph 8722 (MINUS SIGN) missing from current font,这通常是由于字体配置不正确导致的。我需要先理解这个问题的原因,然后找到解决方法,并给出完整的代码示例。
首先,根据引用中的信息,特别是引用[2]和引用[4],问题可能出在matplotlib和seaborn没有正确配置中文字体,或者负号的显示有问题。中文字体缺失会导致无法显示某些字符,而负号的问题可能与unicode_minus的设置有关。
根据引用[2]中的建议,解决步骤包括设置合适的字体,并确保unicode_minus参数正确配置。例如,设置font.sans-serif为中文字体,如Heiti TC(黑体),并且将axes.unicode_minus设为False来避免负号显示问题。同时,需要注释掉可能影响字体设置的sns.set代码,或者在设置时明确指定字体。
接下来,我需要整合这些步骤到一个完整的代码示例中,确保用户能够直接复制使用。需要包含必要的库导入、字体配置、数据清洗和可视化的部分。可能需要生成一些示例数据来演示绘图,并展示如何避免警告的出现。
另外,要注意用户可能同时需要处理中文显示和负号的问题,所以代码中需要同时配置这两部分。例如,设置plt.rcParams的字体和unicode_minus参数,同时配置seaborn的字体设置。还需要确保安装的字体在系统中存在,如果用户使用不同的操作系统,可能需要调整字体名称,比如在Windows中使用SimHei,在Mac中使用Heiti TC。
最后,要检查代码是否包含所有必要的部分,包括导入库、设置参数、数据生成、绘图函数以及显示图形。确保示例代码能够直接运行,并且不会出现用户提到的警告。</think>以下是解决Python数据清洗与可视化中字体相关警告的完整代码实现,包含具体配置和详细注释:
```python
# 导入必要库
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
# ========== 关键配置步骤 ==========
# 1. 设置中文字体(根据系统选择对应字体)
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows系统使用黑体
# plt.rcParams['font.sans-serif'] = ['Heiti TC'] # Mac系统使用黑体
sns.set(font='SimHei') # 同步设置seaborn字体
# 2. 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False # 关闭unicode负号显示
matplotlib.rcParams['axes.unicode_minus'] = False # 双重保险设置
# 3. 禁用可能冲突的seaborn预设样式
# sns.set(style="whitegrid") # 如需使用样式需在字体设置之后
# ========== 数据生成 ==========
# 创建示例数据(包含中文标签和负值)
dates = pd.date_range('2023-01-01', periods=30)
data = {
'日期': dates,
'销售额': np.random.randint(-5, 15, 30).cumsum(),
'类别': ['A类']*15 + ['B类']*15
}
df = pd.DataFrame(data)
# ========== 数据清洗 ==========
# 处理负值(示例:将负销售额归零)
df['修正销售额'] = df['销售额'].apply(lambda x: x if x > 0 else 0)
# ========== 可视化展示 ==========
# 创建组合图表
fig, axes = plt.subplots(2, 1, figsize=(10, 8))
# 折线图(含负值)
sns.lineplot(
x='日期',
y='销售额',
hue='类别',
data=df,
ax=axes[0],
marker='o',
style='类别',
markersize=8
)
axes[0].set_title('各品类销售额趋势(含负值)')
axes[0].axhline(0, color='gray', linestyle='--') # 零值参考线
# 柱状图(修正后数据)
sns.barplot(
x='日期',
y='修正销售额',
hue='类别',
data=df,
ax=axes[1],
palette='viridis'
)
axes[1].set_title('修正后销售额分布')
axes[1].tick_params(axis='x', rotation=45)
# 自动调整布局并显示
plt.tight_layout()
plt.show()
```
**核心原理说明:**
1. 字体缺失警告(Glyph XXXX missing)是由于matplotlib默认字体不支持中文显示导致,通过明确指定中文字体可解决[^2]
2. 负号警告(Glyph 8722)需要同时设置`axes.unicode_minus = False`来禁用Unicode负号显示,改用ASCII减号[^4]
3. Seaborn需单独设置字体,因其可能覆盖matplotlib的默认设置[^2]
**验证方法:**
```python
# 验证字体配置是否生效
print("当前字体配置:", plt.rcParams['font.sans-serif'])
print("负号显示配置:", plt.rcParams['axes.unicode_minus'])
# 快速测试输出
plt.figure()
plt.plot([-1, 0, 1], [-1, 0, 1], label='测试曲线')
plt.title('中文标题测试')
plt.xlabel('X轴标签')
plt.ylabel('Y轴标签')
plt.legend()
plt.show()
```
**扩展建议:**
1. 若需要其他中文字体,可通过`matplotlib.font_manager`查看系统可用字体
2. 生产环境中建议将字体配置封装为初始化函数
3. 使用Docker部署时可预装中文字体文件
阅读全文
相关推荐


















