Запись $ \ sqrt (2) $ вместо 1.414 в легенде сюжета - PullRequest
3 голосов
/ 24 марта 2019

Используя matplotlib для Python, как мне написать «sqrt (2)» с символом квадратного корня вместо его десятичного значения в легенде графика?Смотрите сюжет и код ниже.Пожалуйста, дайте мне знать, если мне нужно уточнить.Спасибо!

import matplotlib.pyplot as plt
import numpy as np


E = np.linspace(50000,200000,1000) # eV

a = 3.615*10**(-10) #m
h = 6.582*10**(-16) #eV s
m = 9.109*10**(-31) #kg
J = 6.242*10**(-18) #1eV to J

def T(x,E):
    return np.arcsin(x*np.sqrt(J*((np.pi**2 *h**2)/(a**2 * 4*m *E))))*1000

fig, ax = plt.subplots()
x = np.asarray([2*np.sqrt(2), 2, np.sqrt(3)])
for i in x:
    ax.plot(E,T(i,E),label='hkl=%s' % i)
    plt.ylabel('$\Theta$ (mrad)')
    plt.xlabel('Energy (eV)')
    plt.legend(bbox_to_anchor=(1.01, 1), loc=1, borderaxespad=0.)

Сюжет, который это выплевывает:

enter image description here


РЕДАКТИРОВАТЬ: я должен упомянуть, что яхотите, чтобы этот код принимал любое значение в x и отображал его, используя фактический символ квадратного корня в легенде вместо его десятичного значения.

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Вы можете использовать Unicode, чтобы написать символ квадратного корня в виде строки, а затем добавить любое интересующее вас число. Чтобы написать символ квадратного корня в виде строки, используйте '\u221A'.

Один из способов изменить ваш код - превратить x в словарь. Так что x={'2\u221A2': 2*np.sqrt(2), '2':2, '\u221A3':np.sqrt(3)}. Ваш цикл for станет for k,v in x.items(), где k и v являются короткими для ключа и значения, а первая строка в цикле будет ax.plot(E,T(v,E),label='hkl=%s' % k)

С точки зрения синтаксического анализа числа и его записи в виде квадратного корня, это немного сложнее и выглядело бы примерно так при рассмотрении кода: https://codereview.stackexchange.com/questions/144041/reduce-square-root-to-simplest-radical-form

0 голосов
/ 24 марта 2019

Вы можете довольно легко распечатать символ квадратного корня, используя LaTex в maplotlib, т.е.

s = 2
plt.plot(x, y, label=r'$\sqrt{{{}}}$'.format(s))

Сложная часть, конечно, заключается в использовании правильных коэффициентов и корней, это проще, если вы возьметеНемного другой подход к генерации x, что-то вроде этого

import matplotlib.pyplot as plt
import numpy as np

E = np.linspace(50000,200000,1000) # eV

a = 3.615*10**(-10) #m
h = 6.582*10**(-16) #eV s
m = 9.109*10**(-31) #kg
J = 6.242*10**(-18) #1eV to J

def T(x,E):
    return np.arcsin(x*np.sqrt(J*((np.pi**2 *h**2)/(a**2 * 4*m *E))))*1000

fig, ax = plt.subplots()
k = [(2, 2), (2, 1), (1, 3)]
x = list()
labels = list()
for i in range(len(k)):
    x.append(k[i][0] * np.sqrt(k[i][1]))
    if k[i][0] == 1 and k[i][1] != 1:
        labels.append(r'hkl=$\sqrt{{{}}}$'.format(k[i][1]))
    elif k[i][0] != 1 and k[i][1] == 1:
        labels.append(r'hkl=${{{}}}$'.format(k[i][0]))
    elif k[i][0] != 1 and k[i][1] != 1:
        labels.append(r'hkl=${{{}}}\sqrt{{{}}}$'.format(k[i][0], k[i][1]))
    else:
        labels.append('hkl=1')

for i in range(len(x)):
    ax.plot(E,T(x[i],E),label=labels[i])
    plt.ylabel('$\Theta$ (mrad)')
    plt.xlabel('Energy (eV)')
    plt.legend(bbox_to_anchor=(0.99, 0.98), loc=1, borderaxespad=0.)

. Для создания x и произвольной печати символов квадратного корня потребуются любые значения (хотя я уверен, что есть более эффективные способы сделать это).)

Latex Square Root

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...