在数学模式下将变量写为下标

时间:2014-04-24 18:27:20

标签: python matplotlib legend mathematical-expressions

我试图绘制一些数据,使用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()

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

2 个答案:

答案 0 :(得分:4)

原始问题已经过编辑,此答案已更新以反映此问题。

尝试在matplotlib中使用LaTeX格式时,必须使用由r""表示的原始字符串。

下面给出的代码将迭代range(4)并使用i'th均值和方差绘图(如您最初所做的那样)。它还会使用label为每个地图设置label=r'$v_{}$'.format(i+1)。这个string formatting只是将{}替换为format内的所有内容,在本例中为i+1。通过这种方式,您可以自动化图表的标签。

我已将plt.axvline(...)plt.xlabel(...)plt.ylabel(...)移出for循环,因为您只需要调用一次。我也出于同样的原因从plt.legend()循环中删除了for并删除了其参数。如果您将关键字参数label提供给plt.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()

Plot

答案 1 :(得分:1)

所以事实证明你根据我的回答编辑了你的问题。但是,你;仍然不在那里。如果你想以我认为你想要编码的方式去做,它应该是这样的:

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()

此代码生成下图: enter image description here 如果您希望第一个绘图以v_1而不是v_0开头,则需要更改str(i+1)。这样下标是1,2,3和4,而不是0,1,2和3。

希望这有帮助!