Python 如何为matplotlib安装草书字体:找不到字体系列[';草书';]

Python 如何为matplotlib安装草书字体:找不到字体系列[';草书';],python,matplotlib,fonts,Python,Matplotlib,Fonts,当试图在Ubuntu 20.04上运行一个使用matplotlib中的草书字体的脚本(在下面的最小工作示例中给出)时,我收到了matplotlib警告: findfont: Font family ['cursive'] not found. Falling back to DejaVu Sans. 这说明我没有任何matplotlib想要使用的草书字体。 当matplotlib的字体管理器或fc list # on my local machine $ fc-list : family |

当试图在Ubuntu 20.04上运行一个使用
matplotlib
中的草书字体的脚本(在下面的最小工作示例中给出)时,我收到了
matplotlib
警告:

findfont: Font family ['cursive'] not found. Falling back to DejaVu Sans.
这说明我没有任何
matplotlib
想要使用的草书字体。 当
matplotlib
的字体管理器或
fc list

# on my local machine
$ fc-list : family | grep -i "chancery\|textile\|sand\|script\|felipa\|cursive"
URW Chancery L
Free Chancery
如何通过编程在Ubuntu上查找和安装这些字体?我知道我可以在互联网上搜索免费版本,但如果我想在Docker映像上获取它们,我如何通过CLI API(如
apt get
)安装它们

最小失败示例 对于以下
Dockerfile

FROM ubuntu:20.04

RUN apt-get update -y && \
    apt-get install -y \
        fontconfig \
        fonts-dejavu \
        fonts-freefont-ttf \
        python3 \
        python3-dev \
        python3-pip \
        python3-venv \
        vim && \
        apt-get -y autoclean && \
        apt-get -y autoremove && \
        rm -rf /var/lib/apt/lists/*

RUN python3 -m pip install --upgrade --no-cache-dir pip setuptools wheel && \
    python3 -m pip install --no-cache-dir "matplotlib~=3.3" && \
    python3 -m pip list && \
    python3 -c "import matplotlib.pyplot" # generate font list cache

ENV MPLCONFIGDIR /tmp/.config # make writeable to non-root user

WORKDIR /code

COPY example.py example.py
使用的
example.py

将numpy导入为np
将matplotlib.pyplot作为plt导入
导入matplotlib.font\u管理器
def make_绘图(字体族):
图,ax=plt.子批次()
x=np.linspace(0,10101)
y=np.平方(x)
轴图(x,y)
ax.符号学()
ax.set\u xlabel($x$)
ax.set_ylabel($x^2$)
ax.set_title(f“用于{font_family}font family的默认matplotlib设置”)
返回无花果,斧头
def main():
图像类型=[“pdf”,“png”]
对于[“无衬线”、“衬线”、“草书”]中的字体\ U系列:
plt.rcParams.update({“font.family”:font\u family})
图,ax=制作图(font\U系列=font\U系列)
对于图像类型中的类型:
图savefig(f“家族{font{U家族}.{type}”)
cursive_family=matplotlib.rcParams[“font.cursive”]
打印(f“\nmatplotlib草书族:{cursive\u family}”)
tff_字体=已排序(
set([matplotlib.font\u manager.fontManager.ttflist中字体的font.name])
)
afm_字体=已排序(
set([matplotlib.font\u manager.fontManager.afmlist中字体的font.name])
)
所有字体=已排序(设置([*tff\U字体,*afm\U字体])
打印(f“\ntff字体:{tff_字体}”)
打印(f“\nafm字体:{afm_字体}”)
打印(f“\n所有字体:{所有字体}”)
找到\u草书\u字体=[如果字体在所有\u字体中,则为草书\u系列中的字体的字体]
打印(f“\n找到草书字体:{找到草书字体}”)
如果名称=“\uuuuu main\uuuuuuuu”:
main()
如果用

docker build . \
--pull \
-f Dockerfile \
-t matplotlib-cursive-fonts-question:debug-local
然后和我一起跑

$ docker run --rm --user 1000:1000 -v $PWD:$PWD -w $PWD matplotlib-cursive-fonts-question:debug-local /bin/bash -c "python3 /code/example.py"
findfont: Font family ['cursive'] not found. Falling back to DejaVu Sans.
findfont: Font family ['cursive'] not found. Falling back to DejaVu Sans.

matplotlib cursive family: ['Apple Chancery', 'Textile', 'Zapf Chancery', 'Sand', 'Script MT', 'Felipa', 'cursive']

tff fonts: ['DejaVu Math TeX Gyre', 'DejaVu Sans', 'DejaVu Sans Display', 'DejaVu Sans Mono', 'DejaVu Serif', 'DejaVu Serif Display', 'FreeMono', 'FreeSans', 'FreeSerif', 'STIXGeneral', 'STIXNonUnicode', 'STIXSizeFiveSym', 'STIXSizeFourSym', 'STIXSizeOneSym', 'STIXSizeThreeSym', 'STIXSizeTwoSym', 'cmb10', 'cmex10', 'cmmi10', 'cmr10', 'cmss10', 'cmsy10', 'cmtt10']

afm fonts: ['Computer Modern', 'Courier', 'Helvetica', 'ITC Avant Garde Gothic', 'ITC Bookman', 'ITC Zapf Chancery', 'ITC Zapf Dingbats', 'New Century Schoolbook', 'Palatino', 'Symbol', 'Times', 'Utopia', 'ZapfDingbats']

all fonts: ['Computer Modern', 'Courier', 'DejaVu Math TeX Gyre', 'DejaVu Sans', 'DejaVu Sans Display', 'DejaVu Sans Mono', 'DejaVu Serif', 'DejaVu Serif Display', 'FreeMono', 'FreeSans', 'FreeSerif', 'Helvetica', 'ITC Avant Garde Gothic', 'ITC Bookman', 'ITC Zapf Chancery', 'ITC Zapf Dingbats', 'New Century Schoolbook', 'Palatino', 'STIXGeneral', 'STIXNonUnicode', 'STIXSizeFiveSym', 'STIXSizeFourSym', 'STIXSizeOneSym', 'STIXSizeThreeSym', 'STIXSizeTwoSym', 'Symbol', 'Times', 'Utopia', 'ZapfDingbats', 'cmb10', 'cmex10', 'cmmi10', 'cmr10', 'cmss10', 'cmsy10', 'cmtt10']

found cursive fonts: []

不返回任何内容

问题 如何通过编程找到并安装
matplotlib
(在Ubuntu 20.04上)所需的草书字体

相关链接

由于似乎没有明确的方法从任何Ubuntu PPA获得这些字体,因此可以做的是直接从Google fonts下载草书字体系列字体之一。这就是
maptlotlib
团队在中所做的

因此,对于本地机器上的编程解决方案,我所能做的只是

mkdir-p~/.local/share/font/truetype/felipa
wget——无冲击https://github.com/google/fonts/blob/master/ofl/felipa/Felipa-Regular.ttf?raw=true -O~/.local/share/font/truetype/felipa/felipa-Regular.ttf
fc缓存--强制--详细#为系统重建字体缓存
rm-rf~/.cache/matplotlib/*#删除matplotlib缓存以强制重建
虽然这不是必需的,但我还制作了一个符号链接,指向我的其他字体用于记账的位置

sudo ln-s“${HOME}/.local/share/font/truetype/felipa”/usr/share/font/truetype/felipa
当然,虽然这是程序化的,但如果您在本地机器上,并且具有交互功能,那么只需访问它可能会更好/更容易,在本地下载字体系列zip文件并将其解压缩,然后使用打开Felipa Regular.ttf,让它为您安装

为了给出此工作的可复制示例,我已将原始Dockerfile编辑为上文所述的
wget
Felipa,然后还创建了一个非根用户“docker”,以使容器在默认情况下以非根用户身份运行,并避免在使用
--user 1000:1000
运行时出现
主用户数减少的问题。有很多方法可以使这个Dockerfile更加紧凑,但在这个例子中,我要考虑的是可读性,而不是大小优化

FROM ubuntu:20.04

RUN apt-get update -y && \
    apt-get install -y \
        fontconfig \
        fonts-dejavu \
        fonts-freefont-ttf \
        python3 \
        python3-dev \
        python3-pip \
        python3-venv \
        vim \
        wget && \
        apt-get -y autoclean && \
        apt-get -y autoremove && \
        rm -rf /var/lib/apt/lists/*

RUN python3 -m pip install --upgrade --no-cache-dir pip setuptools wheel && \
    python3 -m pip install --no-cache-dir "matplotlib~=3.3" && \
    python3 -m pip list

# Create user "docker"
RUN useradd -m docker && \
    cp /root/.bashrc /home/docker/
ENV HOME /home/docker

# felipa provides a cursive font
RUN mkdir -p "${HOME}/.local/share/fonts/truetype/felipa" && \
    wget --no-clobber "https://github.com/google/fonts/blob/master/ofl/felipa/Felipa-Regular.ttf?raw=true" -O "${HOME}/.local/share/fonts/truetype/felipa/Felipa-Regular.ttf" && \
    ln -s "${HOME}/.local/share/fonts/truetype/felipa" /usr/share/fonts/truetype/felipa && \
    fc-cache --force --verbose

WORKDIR /code

COPY example.py example.py

# give non-root user docker ownership of files
RUN chown -R --from=root docker /home/docker && \
    chown -R --from=root docker /code
USER docker

# Create font list cache and config dir
RUN python3 -c "import matplotlib.pyplot"
如前所述重新构建此Docker映像,然后允许在没有警告或错误的情况下运行以下操作

$ docker run --rm -v $PWD:$PWD -w $PWD matplotlib-cursive-fonts-question:debug-local /bin/bash -c "python3 /code/example.py"

matplotlib cursive family: ['Apple Chancery', 'Textile', 'Zapf Chancery', 'Sand', 'Script MT', 'Felipa', 'cursive']

tff fonts: ['DejaVu Math TeX Gyre', 'DejaVu Sans', 'DejaVu Sans Display', 'DejaVu Sans Mono', 'DejaVu Serif', 'DejaVu Serif Display', 'Felipa', 'FreeMono', 'FreeSans', 'FreeSerif', 'STIXGeneral', 'STIXNonUnicode', 'STIXSizeFiveSym', 'STIXSizeFourSym', 'STIXSizeOneSym', 'STIXSizeThreeSym', 'STIXSizeTwoSym', 'cmb10', 'cmex10', 'cmmi10', 'cmr10', 'cmss10', 'cmsy10', 'cmtt10']

afm fonts: ['Computer Modern', 'Courier', 'Helvetica', 'ITC Avant Garde Gothic', 'ITC Bookman', 'ITC Zapf Chancery', 'ITC Zapf Dingbats', 'New Century Schoolbook', 'Palatino', 'Symbol', 'Times', 'Utopia', 'ZapfDingbats']

all fonts: ['Computer Modern', 'Courier', 'DejaVu Math TeX Gyre', 'DejaVu Sans', 'DejaVu Sans Display', 'DejaVu Sans Mono', 'DejaVu Serif', 'DejaVu Serif Display', 'Felipa', 'FreeMono', 'FreeSans', 'FreeSerif', 'Helvetica', 'ITC Avant Garde Gothic', 'ITC Bookman', 'ITC Zapf Chancery', 'ITC Zapf Dingbats', 'New Century Schoolbook', 'Palatino', 'STIXGeneral', 'STIXNonUnicode', 'STIXSizeFiveSym', 'STIXSizeFourSym', 'STIXSizeOneSym', 'STIXSizeThreeSym', 'STIXSizeTwoSym', 'Symbol', 'Times', 'Utopia', 'ZapfDingbats', 'cmb10', 'cmex10', 'cmmi10', 'cmr10', 'cmss10', 'cmsy10', 'cmtt10']

found cursive fonts: ['Felipa']
系列\u cursive.png
生成此绘图:

$ docker run --rm -v $PWD:$PWD -w $PWD matplotlib-cursive-fonts-question:debug-local /bin/bash -c "python3 /code/example.py"

matplotlib cursive family: ['Apple Chancery', 'Textile', 'Zapf Chancery', 'Sand', 'Script MT', 'Felipa', 'cursive']

tff fonts: ['DejaVu Math TeX Gyre', 'DejaVu Sans', 'DejaVu Sans Display', 'DejaVu Sans Mono', 'DejaVu Serif', 'DejaVu Serif Display', 'Felipa', 'FreeMono', 'FreeSans', 'FreeSerif', 'STIXGeneral', 'STIXNonUnicode', 'STIXSizeFiveSym', 'STIXSizeFourSym', 'STIXSizeOneSym', 'STIXSizeThreeSym', 'STIXSizeTwoSym', 'cmb10', 'cmex10', 'cmmi10', 'cmr10', 'cmss10', 'cmsy10', 'cmtt10']

afm fonts: ['Computer Modern', 'Courier', 'Helvetica', 'ITC Avant Garde Gothic', 'ITC Bookman', 'ITC Zapf Chancery', 'ITC Zapf Dingbats', 'New Century Schoolbook', 'Palatino', 'Symbol', 'Times', 'Utopia', 'ZapfDingbats']

all fonts: ['Computer Modern', 'Courier', 'DejaVu Math TeX Gyre', 'DejaVu Sans', 'DejaVu Sans Display', 'DejaVu Sans Mono', 'DejaVu Serif', 'DejaVu Serif Display', 'Felipa', 'FreeMono', 'FreeSans', 'FreeSerif', 'Helvetica', 'ITC Avant Garde Gothic', 'ITC Bookman', 'ITC Zapf Chancery', 'ITC Zapf Dingbats', 'New Century Schoolbook', 'Palatino', 'STIXGeneral', 'STIXNonUnicode', 'STIXSizeFiveSym', 'STIXSizeFourSym', 'STIXSizeOneSym', 'STIXSizeThreeSym', 'STIXSizeTwoSym', 'Symbol', 'Times', 'Utopia', 'ZapfDingbats', 'cmb10', 'cmex10', 'cmmi10', 'cmr10', 'cmss10', 'cmsy10', 'cmtt10']

found cursive fonts: ['Felipa']