Запись переменных в виде индексов в математическом режиме

Я пытаюсь построить некоторые данные, используя цикл 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()

Это не работает, и я не могу сохранить переменную между знаками $$ математической записи, так как она интерпретируется как текст. Есть ли способ поместить переменную в нотацию $$?


person Sahil M    schedule 24.04.2014    source источник


Ответы (2)


Исходный вопрос был отредактирован, этот ответ был обновлен, чтобы отразить это.

При попытке работать с форматированием LaTeX в matplotlib вы должны использовать необработанные строки, обозначаемые 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 по той же причине и удалил его аргументы. Если вы укажете аргумент ключевого слова от 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()

Сюжет

person Ffisegydd    schedule 24.04.2014
comment
Но проблема остается, так как я все еще не могу использовать переменные в режиме математического текста. В данном случае это были номера 1-4. Это также может быть текст, например, e^x, e^y и т. д., где «x», «y», «z» и т. д. — это переменные, помещаемые в математический режим. Не знаете ли вы, возможно ли такое использование? - person Sahil M; 25.04.2014
comment
К сожалению, я не понимаю, что вы имеете в виду, вы говорите, что математический текстовый режим не работает? Или вы говорите, что не хотите выбирать метки, а вместо этого хотели бы, чтобы он автоматически выбирал переменную, которую вы начертили? Если так, то это невозможно нет. - person Ffisegydd; 25.04.2014
comment
Поскольку вы изменили свой вопрос, я отредактировал свой ответ, чтобы принять это во внимание. Теперь я считаю, что этот ответ отвечает на ваш вопрос. - person Ffisegydd; 25.04.2014
comment
Конечно, .format мне вообще не приходило в голову использовать это. Спасибо и +1 за ссылку на страницу документации. :) Я внес правку, удалив p = [], так как это больше не требуется. - person Sahil M; 25.04.2014
comment
почему это не работает, когда в индексе несколько букв? в качестве нижнего индекса отображается только первая буква - person blindeyes; 28.03.2020

Так получается, что вы отредактировали свой вопрос на основе моего ответа. Тем не менее, вы все еще не совсем там. Если вы хотите сделать это так, как я думаю, вы хотите это закодировать, это должно быть так:

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.

Надеюсь это поможет!

person The Dude    schedule 24.04.2014