yticks 的字体大小意外可变

yticks have unexpectedly variable font size

我正在修改图形的 yticks 字体大小,但并非所有 yticks 的字体大小都相同。最后两个 yticks 0.80.6 比其他的大。

def mm_to_inch(value):
    return value/25.4

import matplotlib
matplotlib.use('Agg')
matplotlib.rcParams['font.sans-serif'] = "Arial"
matplotlib.rcParams['font.family'] = "sans-serif"
matplotlib.rcParams['figure.dpi'] = 300
import pandas as pd
import matplotlib.pyplot as plt

size = 112
fig, ax1 = plt.subplots(figsize=(mm_to_inch(size), mm_to_inch(size/2)))

df = pd.read_csv('testing_errors_prob.csv')
df = df.drop(['precision', 'recall', 'TP', 'FP', 'TN', 'FN'], axis=1)
df = df.sort_values(by=['accuracy'], ascending=False)
df = df.replace({'Gaussian Nb': 'Gaussian\nNb', 'Extra Trees': 'Extra\nTrees', 'Random Forest': 'Random\nForest',
                     'Decision Tree': 'Decision\nTree', 'Gradient Boost': 'Gradient\nBoost', 'Linear SVC': 'Linear\nSVC',
                     'Ada Boost': 'Ada\nBoost', 'Bernouli Nb': 'Bernouli\nNb'})
df.plot.bar(x='model', ax=ax1, color=['#093145', '#107896', '#829356'], width=0.8)
plt.tight_layout()

# plt.xticks(rotation=45, ha="right", fontsize=6)
# plt.yticks(fontsize=6)
plt.xticks(rotation=45, ha="right", fontsize=6)
plt.yticks(fontsize=6)
plt.legend(["Accuracy", "F1", "AUC ROC"], fontsize="xx-large", prop={'size': 5})

plt.subplots_adjust(left=0.07, right=0.9, top=0.9, bottom=0.2)
plt.xlabel('')

plt.savefig('results_updateddd_{}.png'.format(size))
plt.savefig('results_updateddd_{}.pdf'.format(size))
plt.close()

图形是这样的:

我仍然不确定为什么,但错误来自 plt.yticks(fontsize=6)。我将其删除并替换为

ax1.tick_params(axis='both', which='major', labelsize=6)

主要问题是 subplots_adjust 在改变子图布局时导致新的 yticks 出现:

  • yticks(fontsize=6) 仅针对现有报价,因此不会影响任何未来出现的报价(例如,出现在 subplots_adjust 之后的新报价)
  • tick_params(labelsize=6) 设置整个 Axes 的刻度大小,因此即使出现新的刻度,它们也会自动继承这个刻度大小Axes
  • 的一部分

所以如果你想使用yticks(fontsize=6)方法,一定要最后调用它:

...
plt.subplots_adjust(left=0.07, right=0.9, top=0.9, bottom=0.2)
plt.yticks(fontsize=6)
...
fontsize -> subplots_adjust subplots_adjust -> fontsize