#python #numpy #matplotlib
Вопрос:
Как я могу найти максимальные точки кривых, сгенерированных контурной диаграммой, а затем соединить их?
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(263, 383, 0.001)
r=np.arange(0.1,0.9,0.1)
T, R = np.meshgrid(t, r)
k1=np.exp(17.34-(48900./(8.314*T)))
k2=np.exp(42.02-(124200./(8.314*T)))
XA=(k1-R)/(k1 k2)
plt.contour(T,XA,R)
plt.axis([263,383,0,1])
plt.show()
Ответ №1:
- Извлеките индекс,
idx
, максимального значения из каждой строки массиваXA
- Используйте
idx
T
иXA
для извлечения значений по осям x и y.- Индексирование массива происходит немного быстрее, чем при использовании
y = XA.max(axis=1)
для полученияmax
XA
значений.
- Индексирование массива происходит немного быстрее, чем при использовании
- Форма
XA
есть(8, 120000)
, поэтому существует 8 максимумов. Я не уверен, почему отображаются только 7 контурных линий.- Используйте
x[:-1]
иy[:-1]
не стройте последнюю точку.
- Используйте
# get index of max value for each row
idx = np.argmax(XA, axis=1)
# use idx to get the x-axis values from T that correspond to max XA
x = np.take_along_axis(T, np.expand_dims(idx, axis=-1), axis=-1).squeeze(axis=-1)
# use idx to get the max y-axis values from XA
y = np.take_along_axis(XA, np.expand_dims(idx, axis=-1), axis=-1).squeeze(axis=-1)
# plot
plt.contour(T,XA,R)
plt.plot(x, y, marker='o') # plot the points
plt.axis([263,383,0,1])
plt.show()