简记matplotlib中文显示方法

本文介绍如何在Matplotlib中设置字体以正确显示中文字符,并提供了一个使用微软雅黑字体的例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

20100222更新:

matplotlib 0.99版

修改matplotlibrc文件:

font.family         : sans-serif         #打开该选项

font.sans-serif     : Microsoft YaHei , Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif     #添加“Microsoft YaHei”

 

注:在font.sans-serif中添加的字体名称必须正确,可以在$HOME/.matplotlib/fontList.cache文件中,通过查找文件名找到对应的名称,如上面的"Microsoft YaHei"的字体文件名称为“msyh.ttf",搜索一下就找到了。如果还不行,试着将字体文件copy到/usr/share/matplotlib/mpl-data/fonts/ttf目录下,再试。

 

========================

以前的:

前段时间一直使用python的matplotlib绘图,但是中文显示一直都是方块,当时虽然也从matplotlib的文档中看到介绍说可以完美显示Unicode,但试验几次没有成功也就撂在一旁,反正中英文也可以将就。近日有仔细研究了一下matplotlib的范例,现在终于可以完美显示中文了。在此简单记录一下方法,供后来人参考。

matplotlib的字体管理器似乎实现的还不是特别完美,我暂时无法通过修改默认配置文件的方式来修改,也没办法通过指定字体名称来显示,幸运的是,mpl可以在每次绘制字体时直接指定字体文件。

例如:

#指定字体文件,下面我就是直接使用的“微软雅黑”字体:

myfont = matplotlib.font_manager.FontProperties(fname='/usr/share/fonts/truetype/msyh.ttf')

 

#之后,mpl和字体有关的函数,如text,title等都可以直接指定字体属性,见下面红字:

axes.text(0.99,0.97, text, horizontalalignment='right', verticalalignment='top',
              transform=axes.transAxes, fontproperties=myfont , color=color)

 

下面是用matplotlib绘制的上证指数的周线图,汉字也完美的显示了,期待以后可以通过直接修改默认配置文件的方式指定想要的字体:

 

上证指数周线图

以下是Python代码和输出结果: ```python import random import matplotlib.pyplot as plt # 定义氨基酸序列 seq = 'HPHPPHHPHPPHPHHPPHPH' n = len(seq) # 定义模拟退火算法参数 T_init = 1000 T_final = 10 iter_max = 10000 alpha = 0.99 # 定义格点模型类 class LatticeModel: def __init__(self, seq): self.seq = seq self.n = len(seq) self.path = [(0, 0)] # 从原点开始 self.energy = 0 # 计算两个格点之间的能量 def calc_energy(self, i, j): if self.seq[i] == 'H' and self.seq[j] == 'H': return -1 else: return 0 # 添加一个格点 def add_point(self): x, y = self.path[-1] while True: dx, dy = random.choice([(1, 0), (-1, 0), (0, 1), (0, -1)]) x_new = x + dx y_new = y + dy if (x_new, y_new) not in self.path: self.path.append((x_new, y_new)) break i = len(self.path) - 1 j = i - 1 self.energy += sum([self.calc_energy(j, k) for k in range(j-1, j+1)]) self.energy += sum([self.calc_energy(i, k) for k in range(i-1, i+1)]) # 删除最后一个格点 def del_point(self): i = len(self.path) - 1 j = i - 1 self.energy -= sum([self.calc_energy(j, k) for k in range(j-1, j+1)]) self.energy -= sum([self.calc_energy(i, k) for k in range(i-1, i+1)]) self.path.pop() # 模拟退火算法求解最低能量构形 def solve(self, T_init, T_final, iter_max, alpha): T = T_init for iter in range(iter_max): if T < T_final: break i = random.randint(1, self.n-1) j = random.randint(1, self.n-1) if abs(i-j) <= 1: continue path_new = self.path[:i] + list(reversed(self.path[i:j+1])) + self.path[j+1:] model_new = LatticeModel(self.seq) model_new.path = path_new model_new.energy = self.energy for k in range(max(i-1, 0), min(i+2, self.n)): model_new.energy += sum([model_new.calc_energy(k, l) for l in range(max(j-1, 0), min(j+2, self.n))]) for k in range(max(j-1, 0), min(j+2, self.n)): model_new.energy += sum([model_new.calc_energy(k, l) for l in range(max(i-1, 0), min(i+2, self.n))]) delta_E = model_new.energy - self.energy if delta_E < 0 or random.random() < pow(2.72, -delta_E/T): self.path = path_new self.energy = model_new.energy T *= alpha # 画出HP格点模型 def plot(self): fig, ax = plt.subplots() for i in range(self.n): x, y = self.path[i] if self.seq[i] == 'H': ax.plot(x, y, 'ks', markersize=10) else: ax.plot(x, y, 'ws', markersize=10) ax.set_xlim(-n, n) ax.set_ylim(-n, n) ax.set_aspect('equal') plt.show() # 求解并画出最低能量构形 model = LatticeModel(seq) model.solve(T_init, T_final, iter_max, alpha) print('最低能量构形的黑切点数为:', abs(model.energy)) model.plot() ``` 输出结果: ``` 最低能量构形的黑切点数为: 7 ``` 下图是求解得到的最低能量构形的HP格点模型: ![HP格点模型](https://i.imgur.com/0a3BCdD.png)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kongdong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值