matplotlib操作集锦

  |  

摘要: 本文记录一下日常的项目中遇到的 matplotlib 的问题以及解决方案

【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:算法题刷刷
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


参考资料:


图例放到图外面

下面带代码中,注意 ax.legend 中的参数 bbox_to_anchor

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats

distributions = {"norm": scipy.stats.norm.pdf
,"cauchy": scipy.stats.cauchy.pdf
,"laplace": scipy.stats.laplace.pdf
,"rayleigh": scipy.stats.rayleigh.pdf
,"expon": scipy.stats.expon.pdf
}

x = np.arange(-10.0, 10.0, 0.1)
data_dict = {}

for k, v in distributions.items():
data_dict[k] = np.array([v(i) for i in x])

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

for k, v in data_dict.items():
ax.plot(x, v, label=k)

ax.legend(loc=2, bbox_to_anchor=(1.01, 1.0), borderaxespad = 0.) # 设置 ax 中 legend 的位置,将其放在图外
fig.savefig("1.png", bbox_inches="tight")

savefig保存的图片标签被截断的问题

加上参数 bbox_inches="tight" 即可

1
plt.savefig("myplot.png", bbox_inches="tight")

设置中文字体

用 font_manager

1
2
3
4
5
import matplotlib.font_manager as fm

font = fm.FontProperties(fname="./simsun.ttc")

ax.set_title("动态图", fontproperties=font)

用 rcParam

下载字体文件 simhei.ttf,放到目录 site-packages/matplotlib/mpl-data/fonts/ttf/ 中,然后做如下设置即可。

1
plt.rcParams['font.sans-serif'] = ['simhei']

可以用以下代码查看存放 font 的路径,每一行打印的是字体名以及对应的路径,上面的 rcParams 设置的正是下面的字体名。

1
2
3
from matplotlib import font_manager
for font in font_manager.fontManager.ttflist:
print("{}: {}".format(font.name, font.fname))

设置完中文字符后,若坐标轴存在负数,则可能存在负号显示问题。解决方法:

1
plt.rcParams['axes.unicode_minus'] = False

自动旋转 xlabel

1
fig.autofmt_xdate()

x 轴标签间隔显示

假设 x 轴标签为 df[“时间”],想每 4 个显示 1 个,代码如下

1
2
3
4
5
6
xticks = list(range(0, len(df["时间"]), 4))
xlabels = [df["时间"].iloc[x] for x in xticks]
xticks.append(len(df["时间"]) - 1)
xlabels.append(df["时间"].iloc[-1])
ax.set_xticks(xticks)
ax.set_xticklabels(xlabels, rotation=40)

柱状图标注数字

有专门的在柱上方添加数值标注的 api: ax.bar_label()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import matplotlib.pyplot as plt
import numpy as np


labels = ['G1', 'G2', 'G3', 'G4', 'G5']
men_means = [20, 34, 30, 35, 27]
women_means = [25, 32, 34, 20, 25]

x = np.arange(len(labels)) # the label locations
width = 0.35 # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, men_means, width, label='Men')
rects2 = ax.bar(x + width/2, women_means, width, label='Women')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()

ax.bar_label(rects1, padding=3) # 更加简单好用的api
ax.bar_label(rects2, padding=3)

fig.tight_layout()

plt.show()


Share