У меня есть модель, состоящая из трех переменных u, v, w, которые изменяются по времени и по пространству. Меня особенно интересует соотношение трех переменных. Но вместо того, чтобы показывать три графика, каждый из которых для одной переменной, я бы предпочел использовать только один сюжет.
Моя идея - использовать треугольник Максвелла (цветной треугольник, см. Http://homepages.abdn.ac.uk/npmuseum/article/Maxwell/MaxTri.html). Я могу легко масштабировать каждую переменную, что ее максимум равен 1. Но я не знаю, реализуется ли эта идея. Если это имеет смысл, оно должно уже существовать. Мой вопрос:
Я пытаюсь привести короткий пример, чтобы было легче понять:
import numpy as np
import matplotlib.pyplot as plt
# create three arrays for the state variables
# space is a 200x200 grid
size = 200
u = np.random.rand(size,size)
v = np.random.rand(size,size)
w = np.random.rand(size,size)
# now I could create 3 subplots and plot the spatial distribution
# for each variable
# but I want something like
col = np.zeros((200,200))
for i in range(200): # loop in x-direction
for j in range(200): # loop in y-direction
col[i,j] = colorTriangle(u[i,j],v[i,j],w[i,j])
plt.contourf(col)
Цвет треугольника funtion не существует. Но я хочу что-то вроде этого: если каждая переменная имеет одинаковое значение в (i, j), цвет должен быть белым (см. Треугольник Максвелла). Если у нас есть только u, он должен быть зеленым. Если у нас есть только v, он должен быть красным. Если у нас есть только w, он должен быть синим.
Если комбинация сложнее, каждая переменная должна "тянуть" в одном цветовом направлении, а цвет должен выбираться в соответствии с местоположением в треугольнике Максвелла.
Вы поняли? Это не обязательно должен быть цветовой треугольник, но я бы имел такую информацию в одном контурном сюжете. И цветовой треугольник поможет интерпретировать цвета.
Чтобы ответить на первый вопрос, есть много вещей, которые следует отметить.
Для начала единственным способом, который может представлять один цвет, является использование цветовой карты, которая отображает скаляр в цвет. Однако треугольник Максвелла нельзя свести к одному значению.
Это не означает, что треугольник maxwell нельзя использовать как своего рода трехмерную карту, отображая 3 значения в цвет. На самом деле это вполне естественно сделать, поскольку Максвелл использует 3 значения a
, b
и c
так что цвет может быть представлен в координатах RGB как (a,b,c)
. Единственное, чего не хватает, это нормализация.
В приведенной ссылке треугольник Максвелла определен так, что a+b+c=1
. Тем не менее, matplotlib принимает координаты RGB как 3 поплавки от 0 до 1, где белый составляет 1,1,1
вместо 1/3,1/3,1/3
. Таким образом, каждый i,j
будет иметь три значения, которые должны быть преобразованы в 3 поплавки между 0 и 1 с учетом этого.
Поэтому вместо нормализации деления на сумму (для получения a+b+c=1
) мы должны нормализовать деление на максимальное значение каждого трио.
В конечном итоге полученное изображение может быть показано с помощью imshow
.
def colorTriangle(r,g,b):
image = np.stack([r,g,b],axis=2)
return image/image.max(axis=2)[:,:,None]
size = 200
X,Y = np.meshgrid(np.linspace(0,1,200),np.linspace(0,1,200))
u = np.full_like(X,.2)
v = Y
w = X**2
plt.imshow(colorTriangle(v,u,w),origin='lower',extent=(0,1,0,1))
# Note that v is first in order to be represented by red
Выходное изображение выглядит следующим образом:
Здесь ясно видно, что при малых значениях x и y, где v
и w
равны нулю, цвет зеленый, так как u
отличен от нуля и намного больше v
и w
. При больших x и малых y преобладает w
, а цвет действительно синий, а когда v
доминирует (большой y и маленький x), цвет красный. Также показано, что при равных значениях всех трех матриц результирующий цвет белый.