用可变行号矩阵注释matplotlib图

时间:2019-01-09 17:40:28

标签: python matplotlib latex visualization

我正在尝试使我在Python中执行的某些绘图任务自动化,其中之一需要使用方矩阵来注释绘图。矩阵的行号可能会更改。 我正在尝试使用Latex和Matplotlib来执行此操作,但是无法获取有效的Latex字符串:

import numpy as np
import matplotlib.pyplot as plt

#Number of rows of matrix
N=4

#create what I believe to be the valid Latex instruction:
beginning="$ \\left( \\begin{array}{"
formatting=N*'c'+'}\n'
array_rows=(N-1)*((N-1)*'%f & '+'%f \\\\\n')
final_row=(N-1)*'%f & '+'%f '
end="\\end{array} \\right) $"

matrix=beginning+formatting+array_rows+final_row+end

#generate some random values for the matrix and put them in a flat tuple
a=np.random.randn(N,N)
vals=tuple(a.flatten())

#attempt to annotate a plot:
fig,ax=plt.subplots(1)
ax.annotate(matrix % vals,(0.2,0.2))

'print(matrix)'返回:

$ \left( \begin{array}{cccc}
%f & %f & %f & %f \\
%f & %f & %f & %f \\
%f & %f & %f & %f \\
%f & %f & %f & %f \end{array} \right) $

这是我期望的,但是'ax.annotate(matrix%vals,(0.2,0.2))'返回:

'RuntimeError: latex was not able to process the following string:
b'$ \\\\left( \\\\begin{array}{cccc}0.587986 & -0.670847 & 1.424638                 & 1.416569 \\\\1.961583 & 2.134095 & 0.296239 & -0.737057 \\\\0.311355 &         0.018828 & 0.031258 & -1.443867 \\\\0.964141 & 0.686492 & -1.367708 &         -1.353436\\\\end{array} \\right) $''

'! Undefined control sequence.
l.13 ...87986 & -0.670847 & 1.424638 & 1.416569 \1.961583 & 2.134095     
& 0.296...'

尽管似乎与反斜杠有关,但我无法弄清楚问题出在哪里。

1 个答案:

答案 0 :(得分:2)

您可以通过在每个字符串前面添加一个r字符来解决,这会将字符串转换为字节字符串,然后可由LaTex解析并正确呈现矩阵。这确实意味着字符串必须为 verbatim LaTex语法,请考虑以下示例

import numpy as np
import matplotlib.pyplot as plt

N=4

beginning=r"$ \left( \begin{array}{"
formatting=N*r'c'+r'}'
array_rows=(N-1)*((N-1)*r'%f & '+r'%f \\')
final_row=(N-1)*r'%f & '+r'%f '
end=r"\end{array} \right) $"

matrix=beginning+formatting+array_rows+final_row+end

a=np.random.randn(N,N)
vals=tuple(a.flatten())

fig,ax=plt.subplots(1)
ax.annotate(matrix % vals,(0.2,0.2))

Plot annotated with LaTex matrix

如果您尝试使用print matrix,这的确会使语法格式有些讨厌,因为\n字符必须解析为\\才能从输入中去除。但是,已编译的LaTex批注将是正确的。