Scatter Plot с Colobar - PullRequest
       10

Scatter Plot с Colobar

0 голосов
/ 04 июня 2018

Я пытаюсь построить более сложные данные, но ради примера я упростил, чтобы показать, что я пытаюсь сделать, но не работает.Смотрите ниже код и выходное изображение.Заметьте, у меня есть закомментированный раздел.По сути, я хочу построить закомментированный раздел сверху, но получаю ошибку:

ValueError: to_rgba: недопустимый rgba arg "0.0" to_rgb: недопустимый rgb arg "0.0" не может преобразовать аргумент в последовательность rgb

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

x1=[1.0,1.5,2.2,1.8]
y1=[1.1,1.4,2.0,1.75]

x2=[1.5,2.5,3.0,3.5,3.6]
y2=[1.3,2.2,3.3,3.4,3.5]

height=[0.0,1.0,2.0,3.0,4.0]

fig = plt.figure(figsize=(8, 8))
ax=plt.subplot()
divider=make_axes_locatable(ax)
sc=plt.scatter(x2, y2, c=height, vmin=np.min(height)-0.5,
           vmax=np.max(height)+0.5, marker='o', s=40, 
           cmap=plt.cm.get_cmap('jet', len(height)))

#sc=plt.scatter(x1, y1, c=height, vmin=np.min(height)-0.5,
#               vmax=np.max(height)+0.5, marker='o', s=40, 
#               cmap=plt.cm.get_cmap('jet', len(height)))

cax=divider.append_axes("right", size='5%', pad=0.05)
cbar=plt.colorbar(sc, cax=cax, ticks=np.arange(np.min(height),np.max(height)+1,1.0))

У меня есть какое-то представление об ошибке.Поскольку второй набор данных не имеет одинаковую длину с первым или наоборот, цветовое кодирование запутывается.Есть ли способ сделать что-то подобное?

A simple plot from above code

1 Ответ

0 голосов
/ 04 июня 2018

Аргумент c для scatter предполагает либо один спецификатор цвета (например, 'blue'), либо серию спецификаторов цвета (например, ['blue', 'red', ...]), либо последовательность чисел, которые отображаются с использованием карты цветов (например, [1, 2, 3, 4, ...], как вы использовали это здесь).

Однако в вашем закомментированном случае предоставленная вами серия не соответствует вашим данным, поэтому scatter не знает, что с ней делать.Что вы хотите с ним сделать?

Вы можете, например, попробовать

height1 = np.arange(len(x1))
sc=plt.scatter(x1, y1, c=height1, vmin=np.min(height1)-0.5,
               vmax=np.max(height1)+0.5, marker='o', s=40, 
               cmap=plt.cm.get_cmap('jet', len(height)))

Редактировать : Это работает следующим образом: Каждая точка данных (x,y) связан с элементом в c, то есть c[i] назначен маркеру в (x[i], y[i]).Вот почему c, x и y должны иметь одинаковую длину, иначе сопоставление не работает.NaN значения в c здесь не помогут.Однако ваши значения в c преобразуются только в цвета, используя указанную вами цветовую карту.А диапазон цветовой карты определяется vmin и vmax.Итак, чтобы убедиться, что ваш цвет использует один и тот же диапазон данных для всех ваших наборов данных, просто предварительно вычислите vmin и vmax перед построением графика с использованием всех данных и установите его соответствующим образом.

Так в вашем случае:

h1 = np.arange(len(x1))
h2 = np.arange(len(x2))

minval = min([np.min(h) for h in [h1, h2]])
maxval = max([np.max(h) for h in [h1, h2]])
nh = len(np.arange(minval, maxval+1, 1))

, а затем

sc=plt.scatter(x1, y1, c=h1, marker='o', s=40, 
               vmin=minval-0.5, vmax=maxval+0.5, 
               cmap=plt.cm.get_cmap('jet', nh)
          )

и для цветовой шкалы

cbar=plt.colorbar(sc, cax=cax, ticks=np.arange(minval, maxval+1,1.0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...