5

我正在尝试绘制一些数据,使用 for 循环来绘制分布。现在我想根据循环计数器将这些分布标记为数学符号中的下标。这就是我目前所处的位置。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab

mean = [10,12,16,22,25]
variance = [3,6,8,10,12]
x = np.linspace(0,40,1000)
for i in range(4):
    sigma = np.sqrt(variance[i])
    y = mlab.normpdf(x,mean[i],sigma)
    plt.plot(x,y,label=$v_i$) # where i is the variable i want to use to label. I should also be able to use elements from an array, say array[i] for the same.
    plt.xlabel("X")
    plt.ylabel("P(X)")
plt.legend()
plt.axvline(x=15, ymin=0, ymax=1,ls='--',c='black')    
plt.show()

这不起作用,我不能将变量保留在数学符号的 $ $ 符号之间,因为它被解释为文本。有没有办法将变量放在 $ $ 符号中?

4

2 回答 2

7

原始问题已被编辑,此答案已更新以反映这一点。

当尝试在 matplotlib 中使用 LaTeX 格式时,您必须使用原始字符串,用r"".

下面给出的代码将使用均值和方差进行迭代range(4)和绘图i'th(就像您最初所做的那样)。它还将label使用label=r'$v_{}$'.format(i+1). 在这种情况下,这种字符串格式只是简单地将 替换{}为内部调用的任何内容。通过这种方式,您可以自动化绘图的标签。formati+1

我已经删除了plt.axvline(...),plt.xlabel(...)plt.ylabel(...)退出了for循环,因为您只需要调用它一次。出于同样的原因,我还plt.legend()从循环中删除了它并删除了它的参数。for如果您提供关键字参数labelplt.plot()那么您可以在绘制它们时单独标记您的图。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab

mean = [10,12,16,22,25]
variance = [3,6,8,10,12]

x = np.linspace(0,40,1000)

for i in range(4):
    sigma = np.sqrt(variance[i])
    y = mlab.normpdf(x,mean[i],sigma)
    plt.plot(x,y, label=r'$v_{}$'.format(i+1))

plt.xlabel("X")
plt.ylabel("P(X)")        
plt.axvline(x=15, ymin=0, ymax=1,ls='--',c='black')

plt.legend()
plt.show()

阴谋

于 2014-04-24T18:44:01.343 回答
4

所以事实证明你根据我的回答编辑了你的问题。然而,你还没有完全在那里。如果你想按照我认为你想要编码的方式来做,它应该是这样的:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab

mean = [10, 12, 16, 22, 25]
variance = [3, 6, 8, 10, 12]
x = np.linspace(0, 40, 1000)
for i in range(4):
    sigma = np.sqrt(variance[i])
    y = mlab.normpdf(x, mean[i], sigma)
    plt.plot(x, y, label = "$v_{" + str(i) + "}$") 
    plt.xlabel("X")
    plt.ylabel("P(X)")

plt.legend()
plt.axvline(x = 15, ymin = 0, ymax = 1, ls = '--', c = 'black')  

plt.show()

此代码生成下图: 在此处输入图像描述 如果您希望第一个绘图以 v_1 而不是 v_0 开头,您需要更改的是str(i+1). 这样下标是 1、2、3 和 4,而不是 0、1、2 和 3。

希望这可以帮助!

于 2014-04-24T23:00:41.630 回答