Matplotlib: общая цветовая карта для 2 графиков рассеяния на одном графике - PullRequest
0 голосов
/ 24 июня 2019

У меня есть двумерные временные ряды, хранящиеся в 2D Numpy arrays. Я хотел бы нанести оба канала серии на один сюжет. Каждая серия должна быть представлена ​​линией, которая окрашена в соответствии с каналом. Вверху этих линий я хочу изобразить точки серии как точки. Они должны быть окрашены в соответствии со значениями в секунду 2D Numpy array той же формы. Мой вопрос: как установить цветовую карту для точек в диапазоне, который является общим для обоих каналов?

Мне удалось получить линии разных цветов и точек для каждой серии с двойным вызовом plt.plot() и plt.scatter() с чем-то вроде:

import matplotlib.pyplot as plt
import numpy as np

# Bivariate time-series of length 10
nchannel, length = 2, 10
array_series = np.random.random((nchannel, length))
array_colors = np.vstack([np.repeat(0, length), np.repeat(1, length)])

colormap = 'jet'
plt.plot(np.arange(length), array_series[0,:])
plt.scatter(np.arange(length), array_series[0,:], c=array_colors[0,:], cmap=colormap)
plt.plot(np.arange(length), array_series[1,:])
plt.scatter(np.arange(length), array_series[1,:], c=array_colors[1,:], cmap=colormap)

Это производит: Current output

Это не желаемый вывод, потому что все точки темно-синие, поэтому различие между 0 и 1 в array_colors потеряно. Я искал что-то вроде замены plt.scatter(..., c=array_colors[i,:], cmap=colormap) на plt.scatter(..., c=array_colors, cmap=colormap). Последнее, однако, вызывает ошибку. Любая идея для решения этой проблемы будет приветствоваться!

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Можно использовать параметры vmin и vmax.

Передать как vmin глобальное минимальное значение и как vmax глобальное максимальное значение. Это заставит все вызовы scatter масштабировать значения в одном и том же диапазоне, создавая единую цветовую шкалу.

Пример:

import matplotlib.pyplot as plt
import numpy as np

nchannel, length = 2, 10
array_series = np.random.random((nchannel, length))
array_colors = np.vstack([np.repeat(0, length), np.repeat(1, length)])

colormap = 'jet'
vmin = np.min(array_colors)
vmax = np.max(array_colors)
x = np.arange(length)

plt.plot(x, array_series[0,:])
plt.scatter(x, array_series[0,:], vmin=vmin, vmax=vmax, c=array_colors[0,:], cmap=colormap)
plt.plot(x, array_series[1,:])
plt.scatter(x, array_series[1,:], vmin=vmin, vmax=vmax, c=array_colors[1,:], cmap=colormap)
1 голос
/ 24 июня 2019

Полагаю, вы можете просто использовать плоскую версию массива:

import matplotlib.pyplot as plt
import numpy as np

# Bivariate time-series of length 10
nchannel, length = 2, 10
array_series = np.random.random((nchannel, length))
array_colors = np.random.random((nchannel, length))

x = np.arange(length)

plt.plot(x, array_series[0,:])
plt.plot(x, array_series[1,:])

xs = np.tile(x, nchannel)
plt.scatter(xs, array_series.flat, c=array_colors.flat)

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