在数学模式中将变量写为下标
我正在尝试绘制一些数据,使用一个循环来绘制分布图。现在我想根据循环的计数器给这些分布图加上标签,标签的格式是数学符号中的下标。这是我目前的进展。
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 个回答
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。
希望这对你有帮助!
7
原问题已经被编辑过,这个回答也进行了相应的更新。
在使用matplotlib处理LaTeX格式时,你需要用到原始字符串,这种字符串用 r""
来表示。
下面的代码会遍历 range(4)
,并使用第 i'th
的均值和方差进行绘图(就像你之前做的那样)。它还会为每个图设置 label
,使用 label=r'$v_{}$'.format(i+1)
。这个 字符串格式化 的意思是把 {}
替换成 format
里面传入的内容,在这个例子中就是 i+1
。这样你就可以自动生成图的标签了。
我把 plt.axvline(...)
、plt.xlabel(...)
和 plt.ylabel(...)
从 for
循环中移除了,因为这些只需要调用一次。出于同样的原因,我也把 plt.legend()
从 for
循环中移除,并且去掉了它的参数。如果你在 plt.plot()
中提供了关键字参数 label
,那么你就可以在绘图时为每个图单独设置标签。
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()