Цвет по 3 переменным - треугольник Максвелла

1

У меня есть модель, состоящая из трех переменных u, v, w, которые изменяются по времени и по пространству. Меня особенно интересует соотношение трех переменных. Но вместо того, чтобы показывать три графика, каждый из которых для одной переменной, я бы предпочел использовать только один сюжет.

Моя идея - использовать треугольник Максвелла (цветной треугольник, см. Http://homepages.abdn.ac.uk/npmuseum/article/Maxwell/MaxTri.html). Я могу легко масштабировать каждую переменную, что ее максимум равен 1. Но я не знаю, реализуется ли эта идея. Если это имеет смысл, оно должно уже существовать. Мой вопрос:

  1. Как преобразовать три переменные в одно значение, которое представляет цвет (например, если у меня есть заполненный график контура, я хочу, чтобы каждая ячейка сетки имела "отношение")?
  2. Можно ли использовать цветной треугольник как цветную панель?

Я пытаюсь привести короткий пример, чтобы было легче понять:

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, он должен быть синим.
Если комбинация сложнее, каждая переменная должна "тянуть" в одном цветовом направлении, а цвет должен выбираться в соответствии с местоположением в треугольнике Максвелла.

Вы поняли? Это не обязательно должен быть цветовой треугольник, но я бы имел такую информацию в одном контурном сюжете. И цветовой треугольник поможет интерпретировать цвета.

Теги:
matplotlib
colors
colorbar

1 ответ

1
Лучший ответ

Чтобы ответить на первый вопрос, есть много вещей, которые следует отметить.

Для начала единственным способом, который может представлять один цвет, является использование цветовой карты, которая отображает скаляр в цвет. Однако треугольник Максвелла нельзя свести к одному значению.

Это не означает, что треугольник 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

Выходное изображение выглядит следующим образом:

Изображение 174551

Здесь ясно видно, что при малых значениях x и y, где v и w равны нулю, цвет зеленый, так как u отличен от нуля и намного больше v и w. При больших x и малых y преобладает w, а цвет действительно синий, а когда v доминирует (большой y и маленький x), цвет красный. Также показано, что при равных значениях всех трех матриц результирующий цвет белый.

  • 0
    Большое спасибо. Это именно то, что я искал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню