D:\tools\python\python.exe D:\历史项目留存2\诺褀2025\python加工浦发模型模拟\py搭建\pythonProject1\KS指标计算\KS01读取数据.py 成功读取 160 条记录 SCORE BAD_FLAG 0 530.0 0 1 585.0 0 2 560.0 0 3 602.0 0 4 650.0 0 KS值计算结果: 最大KS值: 0.2423 KS值对应的分数点: 573.0 D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 32047 (\N{CJK UNIFIED IDEOGRAPH-7D2F}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 35745 (\N{CJK UNIFIED IDEOGRAPH-8BA1}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 21344 (\N{CJK UNIFIED IDEOGRAPH-5360}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 27604 (\N{CJK UNIFIED IDEOGRAPH-6BD4}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 26354 (\N{CJK UNIFIED IDEOGRAPH-66F2}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 32447 (\N{CJK UNIFIED IDEOGRAPH-7EBF}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 20540 (\N{CJK UNIFIED IDEOGRAPH-503C}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 20998 (\N{CJK UNIFIED IDEOGRAPH-5206}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 25968 (\N{CJK UNIFIED IDEOGRAPH-6570}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 22351 (\N{CJK UNIFIED IDEOGRAPH-574F}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 23458 (\N{CJK UNIFIED IDEOGRAPH-5BA2}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 25143 (\N{CJK UNIFIED IDEOGRAPH-6237}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 22909 (\N{CJK UNIFIED IDEOGRAPH-597D}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:82: UserWarning: Glyph 28857 (\N{CJK UNIFIED IDEOGRAPH-70B9}) missing from font(s) DejaVu Sans. FigureCanvasAgg.draw(self) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 20998 (\N{CJK UNIFIED IDEOGRAPH-5206}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 25968 (\N{CJK UNIFIED IDEOGRAPH-6570}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 32047 (\N{CJK UNIFIED IDEOGRAPH-7D2F}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 35745 (\N{CJK UNIFIED IDEOGRAPH-8BA1}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 21344 (\N{CJK UNIFIED IDEOGRAPH-5360}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 27604 (\N{CJK UNIFIED IDEOGRAPH-6BD4}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 26354 (\N{CJK UNIFIED IDEOGRAPH-66F2}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 32447 (\N{CJK UNIFIED IDEOGRAPH-7EBF}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 20540 (\N{CJK UNIFIED IDEOGRAPH-503C}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 22351 (\N{CJK UNIFIED IDEOGRAPH-574F}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 23458 (\N{CJK UNIFIED IDEOGRAPH-5BA2}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 25143 (\N{CJK UNIFIED IDEOGRAPH-6237}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 22909 (\N{CJK UNIFIED IDEOGRAPH-597D}) missing from font(s) DejaVu Sans. self.print_png(buf) D:\tools\pycharm\PyCharm 2024.2\plugins\python-ce\helpers\pycharm_matplotlib_backend\backend_interagg.py:85: UserWarning: Glyph 28857 (\N{CJK UNIFIED IDEOGRAPH-70B9}) missing from font(s) DejaVu Sans. self.print_png(buf) Process finished with exit code 0
时间: 2025-07-23 14:55:08 AIGC 浏览: 31
<think>问题分析:从错误日志中可以看出,程序在绘制KS曲线时出现了中文字符显示问题。这是因为matplotlib默认使用的字体(DejaVu Sans)不包含中文字符。为了解决这个问题,我们需要设置matplotlib使用支持中文的字体。
解决方案:
1. 指定中文字体:我们可以使用系统自带的字体(如SimHei、Microsoft YaHei等)或者下载第三方中文字体。
2. 设置matplotlib的字体参数:通过`plt.rcParams`来设置字体。
具体步骤:
- 在绘制图表前,设置中文字体。
- 注意:不同操作系统可用的中文字体可能不同,需要根据实际情况调整。
修改后的代码示例:
```python
# 在绘图前设置中文字体
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 然后进行绘图
plt.figure(figsize=(10, 6))
plt.plot(df['SCORE'], df['cum_bad_pct'], label='累计坏客户占比')
plt.plot(df['SCORE'], df['cum_good_pct'], label='累计好客户占比')
plt.axvline(x=ks_point, color='r', linestyle='--', label=f'KS点(分数={ks_point})')
plt.title(f'KS曲线 (KS值={ks_value:.4f})')
plt.xlabel('分数')
plt.ylabel('累计占比')
plt.legend()
plt.grid(True)
plt.show()
```
### 常见中文字体推荐:
- Windows: `SimHei`(黑体)、`Microsoft YaHei`(微软雅黑)
- Mac: `Arial Unicode MS`、`PingFang SC`(苹方)
- Linux: `WenQuanYi Micro Hei`(文泉驿微米黑)
### 备选方案:使用绝对路径指定字体文件
如果上述字体名称不生效,可以尝试使用绝对路径指定字体文件:
```python
from matplotlib.font_manager import FontProperties
# 指定字体文件路径(根据实际路径修改)
font_path = 'C:/Windows/Fonts/simhei.ttf' # Windows系统下黑体路径
my_font = FontProperties(fname=font_path)
# 在绘图时指定字体
plt.title(f'KS曲线 (KS值={ks_value:.4f})', fontproperties=my_font)
plt.xlabel('分数', fontproperties=my_font)
plt.ylabel('累计占比', fontproperties=my_font)
# 对于图例,需要在legend中设置prop
plt.legend(prop=my_font)
```
### 注意事项:
1. 设置全局字体后,如果仍然有部分字符无法显示,可以尝试使用`FontProperties`单独设置。
2. 在Linux服务器上运行时,可能需要安装中文字体包。
### 调试建议:
- 打印可用字体列表,确认是否存在所需中文字体:
```python
import matplotlib.font_manager
fonts = matplotlib.font_manager.findSystemFonts()
chinese_fonts = [f for f in fonts if any(name in f.lower() for name in ['simhei', 'yahei', 'pingfang', 'stheitisc', 'wqy'])]
print("可用的中文字体:", chinese_fonts)
```
§§相关问题§§
1. 在matplotlib中,如何避免中文标签显示为方框或乱码?
2. 除了设置字体,还有哪些方法可以解决matplotlib中文显示问题?
3. 在不同操作系统(Windows/Linux/Mac)下,如何配置matplotlib以支持中文显示?
4. 当使用远程服务器(无图形界面)时,如何保存包含中文的图表?</think>您遇到的错误是由于Matplotlib默认字体不支持中文字符导致的。当尝试绘制包含中文标签(如"累计坏客户占比"、"累计好客户占比"等)的图表时,系统找不到对应的字形,从而产生`UserWarning: Glyph ... missing from font(s)`警告。以下是完整的解决方案:
### 解决方案:设置中文字体支持
```python
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
# 解决方案1:使用系统支持的中文字体
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'KaiTi', 'SimSun'] # 常用中文字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 解决方案2:指定具体字体文件(更可靠)
# 查找系统支持的中文字体
chinese_fonts = [f.name for f in fm.fontManager.ttflist if any('CJK' in s for s in f.get_sfnt())]
print("可用的中文字体:", chinese_fonts)
# 选择一种可用字体(以微软雅黑为例)
if 'Microsoft YaHei' in chinese_fonts:
plt.rcParams['font.family'] = 'Microsoft YaHei'
elif 'SimHei' in chinese_fonts:
plt.rcParams['font.family'] = 'SimHei'
else:
# 使用字体文件路径(适用于所有系统)
font_path = 'C:/Windows/Fonts/msyh.ttc' # Windows微软雅黑路径
# font_path = '/System/Library/Fonts/PingFang.ttc' # Mac苹方字体
prop = fm.FontProperties(fname=font_path)
plt.rcParams['font.family'] = prop.get_name()
# 绘制KS曲线
plt.figure(figsize=(10, 6))
plt.plot(df['SCORE'], df['cum_bad_pct'], label='累计坏客户占比')
plt.plot(df['SCORE'], df['cum_good_pct'], label='累计好客户占比')
plt.axvline(x=ks_point, color='r', linestyle='--', label=f'KS点(分数={ks_point})')
plt.title(f'KS曲线 (KS值={ks_value:.4f})')
plt.xlabel('分数')
plt.ylabel('累计占比')
plt.legend()
plt.grid(True)
plt.savefig('ks_curve.png', dpi=300, bbox_inches='tight') # 保存为图片文件
plt.show()
```
### 关键步骤说明:
1. **字体配置优先级**:
- 首选系统自带中文字体(如微软雅黑、黑体)
- 次选通过字体文件路径指定
- 最后尝试使用通用CJK字体
2. **跨平台字体解决方案**:
```python
# Windows字体路径
win_fonts = [
'C:/Windows/Fonts/simhei.ttf', # 黑体
'C:/Windows/Fonts/simsun.ttc', # 宋体
'C:/Windows/Fonts/msyh.ttc' # 微软雅黑
]
# MacOS字体路径
mac_fonts = [
'/System/Library/Fonts/PingFang.ttc', # 苹方
'/Library/Fonts/Arial Unicode.ttf'
]
# Linux字体路径
linux_fonts = [
'/usr/share/fonts/truetype/wqy/wqy-microhei.ttc' # 文泉驿微米黑
]
```
3. **避免中文问题的替代方案**:
```python
# 使用英文标签替代
plt.plot(df['SCORE'], df['cum_bad_pct'], label='Cumulative Bad Rate')
plt.plot(df['SCORE'], df['cum_good_pct'], label='Cumulative Good Rate')
plt.axvline(x=ks_point, color='r', linestyle='--', label=f'KS Point (Score={ks_point})')
plt.title(f'KS Curve (KS={ks_value:.4f})')
plt.xlabel('Score')
plt.ylabel('Cumulative Percentage')
```
### 调试建议:
1. **检查可用字体**:
```python
import matplotlib.font_manager
fonts = [f.name for f in matplotlib.font_manager.fontManager.ttflist]
chinese_fonts = sorted(set(fonts) & set(['SimHei', 'Microsoft YaHei', 'KaiTi', 'SimSun', 'FangSong']))
print("可用的中文字体:", chinese_fonts)
```
2. **验证字体支持**:
```python
test_text = "中文测试 123 ABC"
plt.text(0.5, 0.5, test_text, fontsize=12, ha='center')
plt.savefig('font_test.png')
```
3. **使用Seaborn库(内置更好字体支持)**:
```python
import seaborn as sns
sns.set(font='SimHei') # 设置中文字体
sns.lineplot(x='SCORE', y='cum_bad_pct', data=df, label='坏客户占比')
sns.lineplot(x='SCORE', y='cum_good_pct', data=df, label='好客户占比')
plt.axvline(ks_point, color='r', linestyle='--')
```
阅读全文
相关推荐


















