matplotlib - 将字体更改为 avant Matplotlib
问题描述
我正在尝试实现 matplotlib 图的自定义程序以使用乳胶作品。如需更多参考,请查看以下链接:LaTeXify Matplotlib
目标是将字体系列更改为 avant,使其与完整报告的字体相匹配。选择的前卫字体的快照可以在下面找到:
以下代码显示了我尝试过的内容。我实现了以下代码:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import matplotlib
from math import sqrt
SPINE_COLOR = 'gray'
def latexify(fig_width=None, fig_height=None, columns=1):
"""Set up matplotlib's RC params for LaTeX plotting.
Call this before plotting a figure.
Parameters
----------
fig_width : float, optional, inches
fig_height : float, optional, inches
columns : {1, 2}
"""
# code adapted from http://www.scipy.org/Cookbook/Matplotlib/LaTeX_Examples
# Width and max height in inches for IEEE journals taken from
# computer.org/cms/Computer.org/Journal%20templates/transactions_art_guide.pdf
assert(columns in [1,2])
if fig_width is None:
fig_width = 3.39 if columns==1 else 6.9 # width in inches
if fig_height is None:
golden_mean = (sqrt(5)-1.0)/2.0 # Aesthetic ratio
fig_height = fig_width*golden_mean # height in inches
MAX_HEIGHT_INCHES = 8.0
if fig_height > MAX_HEIGHT_INCHES:
print("WARNING: fig_height too large:" + fig_height +
"so will reduce to" + MAX_HEIGHT_INCHES + "inches.")
fig_height = MAX_HEIGHT_INCHES
params = {'backend': 'ps',
'text.latex.preamble':[r'\usepackage{gensymb}', r'\usepackage{avant}'],
'axes.labelsize': 8, # fontsize for x and y labels (was 10)
'axes.titlesize': 8,
'font.size': 8, # was 10
'legend.fontsize': 8, # was 10
'xtick.labelsize': 8,
'ytick.labelsize': 8,
'text.usetex': True,
'figure.figsize': [fig_width,fig_height],
'font.family': 'avant'
}
matplotlib.rcParams.update(params)
def format_axes(ax):
for spine in ['top', 'right']:
ax.spines[spine].set_visible(False)
for spine in ['left', 'bottom']:
ax.spines[spine].set_color(SPINE_COLOR)
ax.spines[spine].set_linewidth(0.5)
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
for axis in [ax.xaxis, ax.yaxis]:
axis.set_tick_params(direction='out', color=SPINE_COLOR)
return ax
df = pd.DataFrame(np.random.randn(10,2))
df.columns = ['Column 1', 'Column 2']
ax = df.plot()
ax.set_xlabel("X label")
ax.set_ylabel("Y label")
ax.set_title("Title")
plt.tight_layout()
plt.savefig("image1.pdf")
latexify()
ax = df.plot()
ax.set_xlabel("X label")
ax.set_ylabel("Y label")
ax.set_title("Title")
plt.tight_layout()
format_axes(ax)
plt.savefig("image2.pdf")
问题是它似乎无法识别先锋字体。这是我收到的错误:
findfont: Font family ['avant'] not found. Falling back to DejaVu Sans.
有人知道如何调整代码以获得所需的字体系列(avant)吗?
解决方案
您可以忽略 findfont 警告。avant
它说它在您的系统上找不到字体。但是,由于您使用乳胶进行文本渲染,因此 matplotlib 找不到字体这一事实无关紧要。
重要的是告诉 matplotlib 使用 sans-serif 字体(因为前卫字体只有一个 sans-serif 字体)。同样对于刻度标签或其他数学模式,您需要告诉它也使用无衬线。
from matplotlib import pyplot as plt
plt.rcParams.update({"text.usetex" : True,
'font.family' : 'sans-serif',
"text.latex.preamble" : r"\usepackage{avant} \usepackage{sansmath} \sansmath"})
x = ["Apples", "Bananas", "Cherry", "Dosenfrüchte"]
y = [400,500,300,100]
plt.bar(x,y, width=0.5, label="Fruits")
plt.legend()
plt.title("A juicy diagram")
plt.show()
有关更多通用信息,请查看matplotlib 中使用乳胶的无衬线数学
推荐阅读
- android - Android Studio 北极狐补丁更新失败
- c++ - cpp中包含线程的程序未完全执行
- c# - 使用下拉菜单选择
- verilog - verilog异步时钟设计问题
- html - 使用 .htaccess 在 HTML 头部插入链接和元标记
- angular - 使用数据对象 Angular 传递数据
- laravel - 缓存具有所有关系的雄辩模型,然后将其转换回具有关系的模型?
- php - PHP -S 服务?“php -S localhost index.php”图像未显示在本地主机上的服务器上
- typescript - Winston Logger 不能在剧作家测试听众/记者之外工作
- javascript - 与嵌套数组对象中的列表 ID 和子列表 ID 匹配时添加另一个属性