import os import re import matplotlib.pyplot as plt import numpy as np import pandas as pd from collections import Counter import matplotlib.font_manager as fm plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 # 查找系统中的中文字体 font_path = None for font in fm.findSystemFonts(): font_name = fm.FontProperties(fname=font).get_name() if "SimHei" in font_name or "Hei" in font_name or "YaHei" in font_name: font_path = font break # 如果找到中文字体,则使用,否则报错 if font_path: my_font = fm.FontProperties(fname=font_path) plt.rcParams['font.sans-serif'] = [my_font.get_name()] else: print("未找到中文字体,可能会导致图表无法正确显示中文") extract_path = "西游记" # 文件夹路径 # 获取TXT文件列表 txt_files = [f for f in os.listdir(extract_path) if f.endswith('.txt')] # 读取所有文本 all_texts = [] for txt_file in txt_files: with open(os.path.join(extract_path, txt_file), "r", encoding="utf-8", errors="ignore") as f: all_texts.append(f.read()) # 合并所有章节文本 full_text = "\n".join(all_texts) chapters = re.split(r"第[一二三四五六七八九十百千]+回", full_text)[1:] # 主要人物 main_characters = ["唐僧", "悟空", "八戒", "沙僧", "妖怪", "神仙"] # 初始化人物出场统计 chapter_counts = {char: [] for char in main_characters} chapter_labels = [f"第{i+1}回" for i in range(len(chapters))] # 统计每个角色在每章节中的出现频率 for chapter in chapters: for char in main_characters: chapter_counts[char].append(chapter.count(char)) # 转换为 Pandas DataFrame df = pd.DataFrame(chapter_counts, index=chapter_labels) x = np.arange(len(df)) y = np.array(df).T fig, ax = plt.subplots(figsize=(12, 6)) ax.stackplot(x, y, labels=main_characters, alpha=0.8) ax.set_title("《西游记》主要人物在各章节的出现频率(河流图)", fontsize=14) ax.set_xlabel("章节", fontsize=12) ax.set_ylabel("出现次数", fontsize=12) ax.legend(loc='upper right', fontsize=10) plt.show() 修改代码绘制主题河流图
时间: 2025-03-23 16:08:56 浏览: 54
<think>嗯,用户想用matplotlib来改进《西游记》主题的河流图可视化效果。首先,我需要回忆一下河流图(streamgraph)的常见实现方法,以及如何用matplotlib来实现。根据用户提供的引用[^1],matplotlib是一个底层的可视化库,灵活性强,但可能需要较多的代码调整。用户现有的代码可能需要优化颜色、布局或者动画效果?
首先,河流图通常是通过堆叠面积图来表现数据随时间的变化,不同颜色代表不同类别。对于《西游记》主题,可能涉及不同角色或事件的频率变化。用户可能希望颜色更符合主题,比如使用古典色调,或者调整标签的字体使其更有中国风。
接下来,用户提到“更优美”,可能涉及几个方面:颜色搭配、平滑曲线、标签美观、背景装饰。我需要考虑如何调整matplotlib的默认设置来实现这些。例如,使用更柔和的颜色,或者从中国传统的颜色方案中挑选,比如使用matplotlib的colormap或者自定义颜色列表。
然后,布局方面,可能需要调整图例的位置,或者隐藏默认的图例,改用直接标注在图表旁边。另外,中文字体的支持也是一个问题,matplotlib默认可能不显示中文,需要设置字体,比如使用SimHei或者其他中文字体。
河流图的平滑处理可以通过插值或者使用更密集的数据点来实现。此外,背景添加一些纹理或图案,比如云纹、山水背景,可能需要使用matplotlib的imshow或者插入图片作为背景,但这样可能会影响数据的可读性,所以需要谨慎处理。
另外,用户可能希望添加动态效果,比如生成GIF或视频,这需要结合matplotlib的动画模块,但这可能比较复杂,需要分步骤实现。
还需要考虑数据的结构是否正确,是否每个类别的数据都正确对齐时间轴。如果用户的数据处理部分有问题,可能需要先调整数据格式,比如使用Pandas进行时间序列的整理。
最后,根据引用[^1]中的建议,matplotlib虽然灵活,但需要较多定制代码。可能需要参考一些高级示例,或者结合其他库如seaborn来简化部分样式设置,但用户提到主要使用matplotlib,所以需要保持代码的纯matplotlib实现。
总结可能的优化点:
1. 颜色方案调整,使用更符合《西游记》主题的颜色。
2. 中文字体设置,避免乱码。
3. 添加图表的标题、轴标签,并美化字体样式。
4. 调整堆叠面积图的透明度或边缘线条,使图表更柔和。
5. 使用平滑处理,使河流图的边缘更流畅。
6. 添加装饰元素,如背景图案或边框。
7. 优化图例或数据标签的位置和样式。
8. 调整布局,增加图表的美观性和可读性。
需要逐步检查这些方面,并提供具体的代码示例,比如如何设置字体,如何选择颜色,如何调整透明度等。同时,提醒用户可能需要安装中文字体,或者在代码中指定字体路径,避免中文显示为方框。</think>### 改进《西游记》主题河流图的Matplotlib代码建议
#### 1. 优化颜色搭配与主题适配
使用符合古典文学主题的配色方案:
```python
colors = ["#8B4513", "#CD853F", "#DAA520", "#B8860B", "#A0522D", "#DEB887"] # 棕色调
plt.stackplot(time, data, colors=colors, alpha=0.8) # 调整透明度
```
#### 2. 支持中文显示与字体美化
```python
plt.rcParams['font.sans-serif'] = ['SimSun'] # 设置宋体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
plt.title("《西游记》情节发展河流图", fontsize=16, fontweight='bold', color='#4B3621')
plt.xlabel("章节进度", fontstyle='italic', color='#6B4F32')
```
#### 3. 添加装饰元素
```python
# 设置背景纹理
ax = plt.gca()
ax.set_facecolor('#FFF8DC') # 米白底色
ax.grid(color='#EDE4C0', linestyle='--', linewidth=0.5)
# 添加装饰边框
for spine in ax.spines.values():
spine.set_color('#A67B5B')
spine.set_linewidth(2)
```
#### 4. 曲线平滑处理
使用样条插值平滑数据:
```python
from scipy.interpolate import make_interp_spline
def smooth_curve(x, y):
xnew = np.linspace(min(x), max(x), 300)
spl = make_interp_spline(x, y, k=3)
return xnew, spl(xnew)
```
#### 5. 动态效果实现(可选)
生成动态可视化:
```python
from matplotlib.animation import FuncAnimation
def animate(i):
ax.clear()
# 绘制部分数据实现动画效果
plt.stackplot(time[:i], data[:, :i], colors=colors, alpha=0.8)
return ax,
ani = FuncAnimation(fig, animate, frames=len(time), interval=50)
```
#### 6. 完整优化示例代码
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import make_interp_spline
# 初始化设置
plt.rcParams['font.sans-serif'] = ['SimSun']
plt.rcParams['axes.unicode_minus'] = False
# 生成示例数据(需替换为实际西游数据)
time = np.linspace(0, 100, 200)
data = np.array([np.sin(time * 0.1 + i) * (10 - i) for i in range(6)])
# 平滑处理
smooth_data = []
for d in data:
xnew, ynew = smooth_curve(time, d)
smooth_data.append(ynew)
# 绘图设置
fig, ax = plt.subplots(figsize=(12, 6))
colors = ["#8B4513", "#CD853F", "#DAA520", "#B8860B", "#A0522D", "#DEB887"]
labels = ["悟空线", "八戒线", "唐僧线", "沙僧线", "妖怪线", "神佛线"]
# 绘制堆叠图
plt.stackplot(xnew, *smooth_data, colors=colors, alpha=0.8, edgecolor='w', linewidth=0.5)
# 装饰元素
ax.set_facecolor('#FFF8DC')
plt.grid(color='#EDE4C0', linestyle='--', linewidth=0.5)
plt.title("《西游记》人物情节发展河流图", fontsize=16, pad=20, color='#4B3621')
plt.xlabel("取经进度(章节)", fontsize=10, color='#6B4F32', labelpad=10)
plt.yticks([]) # 隐藏Y轴刻度
# 添加图例
legend = plt.legend(labels, ncol=6, loc='upper center',
bbox_to_anchor=(0.5, 1.15),
frameon=False,
fontsize=9)
for text in legend.get_texts():
text.set_color('#6B4F32')
plt.show()
```
阅读全文
相关推荐



















