agooo 发表于 2024-7-25 18:44

python在ubuntu22.04系统中运行乱码的问题

本帖最后由 agooo 于 2024-7-25 18:46 编辑

环境:
win10+wsl2里面的ubuntu22.04

编程语言:
python3.x

问题:
在Windows10下面运行py,窗口的折线图里面的中文正常显示。
在wsl2里面运行py,弹出的折线图里面的中文显示乱码。
我查询了wsl2中已经正常安装了dengxian的字体文件,该检查的都查过了。
奇怪的是,我完整的代码中,其他中文选项都能正常显示,唯独折线图里面的显示不了。
我用的是:
import matplotlib.pyplot as plt
import mplcursors
来输出折线图的。

感谢大佬们拔刀相助。



代码如下:

            elif choice == '4':
                  # 映射 local_type_id 到 local_type_display_name 的字典
                  local_type_display_name_map = {
                        2073: '物理类',
                        2074: '历史类',
                        1: '理科',
                        2: '文科'
                  }
                  try:
                        local_type_id = int(local_type_id)
                  except ValueError:
                        print(f"Error: local_type_id 的值不正确: {local_type_id}")
                        local_type_id = None
                  # 获取 local_type_display_name
                  if local_type_id is not None:
                        local_type_display_name = local_type_display_name_map.get(local_type_id, '未知类型')
                  else:
                        local_type_display_name = '未知类型'
                  # 读取 Excel 文件
                  province_name = get_province_name(local_province_id)
                  csv_folder = os.path.join("csv", str(province_name))
                  os.makedirs(csv_folder, exist_ok=True)
                  filename = f"一分一段表_{local_type_display_name}_{province_name}_{year}.xlsx"
                  file_path = os.path.join(csv_folder, filename)
                  sheet_name = '一分一段表'
                  # 使用 pandas 读取数据
                  df = pd.read_excel(file_path, sheet_name=sheet_name)
                  # 提取数据
                  x = df.iloc.tolist()# 从第二行到最后一行的 B 列数据
                  y = df.iloc.tolist()# 从第二行到最后一行的 C 列数据
                  labels = df.iloc]# 从第二行到最后一行的 B、C、D、F、H、J 列数据
                  # 设置字体
                  plt.rcParams['font.sans-serif'] = ['DengXian']# 使用 DengXian 字体
                  plt.rcParams['axes.unicode_minus'] = False
                  # 绘制图表
                  fig, ax = plt.subplots(figsize=(10, 6))
                  line, = ax.plot(x, y, color='#FF6F00', marker='o', linestyle='-')# 使用 PANTONE 1505 C 的颜色
                  # 设置标题和标签   
                  plt_title_name = f"一分一段折线图 {local_type_display_name} {province_name} {year}"
                  plt.title(plt_title_name, fontsize=14, fontweight='bold')
                  plt.xlabel('分数', fontsize=12, fontweight='bold')
                  plt.ylabel('同位次人数', fontsize=12, fontweight='bold')
                  # 设置 X 轴刻度
                  x_ticks =
                  ax.set_xticks(x_ticks)
                  ax.set_xticklabels(x_ticks)
                  # 设置 X 轴刻度从大到小显示
                  ax.invert_xaxis()
                  # 设置坐标轴范围
                  ax.set_xlim(750, 0)# X 轴范围从 750 到 0
                  ax.set_ylim(0, max(y) + 100)# 根据数据自动设置 Y 轴范围
                  ax.grid(True)
                  # 添加动态显示功能
                  cursor = mplcursors.cursor(line, hover=True)
                  annotations = []
                  @cursor.connect("add")
                  def on_add(sel):
                        index = sel.index
                        text = '\n'.join(f"{col}: {val}" for col, val in zip(labels.columns, labels.iloc))
                        annotation = sel.annotation
                        annotation.set(text=text, fontsize=10, color='white', fontweight='bold', bbox=dict(facecolor='#333333', alpha=0.8, edgecolor='none'))
                        annotation.set_visible(True)
                        annotations.append(annotation)# 保存注释对象以便后续操作
                  @cursor.connect("remove")
                  def on_remove(sel):
                        annotation = sel.annotation
                        annotation.set(text='', bbox=dict(facecolor='none', edgecolor='none'))
                        annotation.set_visible(False)
                  def on_click(event):
                        # 如果点击区域不在折线图上,则隐藏所有注释
                        if not (event.inaxes == ax and event.inaxes.get_lines() and event.inaxes.contains(event)):
                            for annotation in annotations:
                              annotation.set_visible(False)
                            fig.canvas.draw()
                  # 绑定点击事件
                  fig.canvas.mpl_connect('button_press_event', on_click)
                  # 设置图形窗口标题
                  fig.canvas.manager.set_window_title(plt_title_name)
                  # 显示图表
                  plt.show()
                  os.system('cls' if os.name == 'nt' else 'clear')
                  break

289051401 发表于 2024-7-25 22:33

要类似import导入中文字体包吧

agooo 发表于 2024-7-26 08:33

289051401 发表于 2024-7-25 22:33
要类似import导入中文字体包吧

没有搞定,换成plotly搞定了。
还是这个好用。
页: [1]
查看完整版本: python在ubuntu22.04系统中运行乱码的问题