Python Matplotlib Ошибка цвета рассеяния - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь создать точечный график с сеткой x и y, где каждая точка получает цвет по заранее заданному значению:

{x: 1, y: 2, value: n}

У меня есть список значений x и y и другой список значений, попробовал использовать это:

# make range of x(0 - 359) and y(-90 - 90)
x, y = np.meshgrid(range(0, 360), range(-90, 90))
colors = [a very long list (64800 values, one for each point)]
print(colors)
plt.scatter(x, y, c=colors)
plt.colorbar()
plt.show()

Ошибка:

Traceback (most recent call last):
  File "C:\python3.6.6\lib\site-packages\matplotlib\colors.py", line 158, in to_rgba
    rgba = _colors_full_map.cache[c, alpha]
KeyError: (1.0986122886681098, None)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\python3.6.6\lib\site-packages\matplotlib\axes\_axes.py", line 4210, in scatter
    colors = mcolors.to_rgba_array(c)
  File "C:\python3.6.6\lib\site-packages\matplotlib\colors.py", line 259, in to_rgba_array
    result[i] = to_rgba(cc, alpha)
  File "C:\python3.6.6\lib\site-packages\matplotlib\colors.py", line 160, in to_rgba
    rgba = _to_rgba_no_colorcycle(c, alpha)
  File "C:\python3.6.6\lib\site-packages\matplotlib\colors.py", line 211, in _to_rgba_no_colorcycle
    raise ValueError("Invalid RGBA argument: {!r}".format(orig_c))
ValueError: Invalid RGBA argument: 1.0986122886681098

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/amit neumark/Documents/עמית/alpha/grbs data/grbs/find_burst_location.py", line 168, in <module>
    main()
  File "C:/Users/amit neumark/Documents/עמית/alpha/grbs data/grbs/find_burst_location.py", line 161, in main
    ra2, dec2 = chi_square(model, relations)
  File "C:/Users/amit neumark/Documents/עמית/alpha/grbs data/grbs/find_burst_location.py", line 33, in chi_square
    create_plot(sums)
  File "C:/Users/amit neumark/Documents/עמית/alpha/grbs data/grbs/find_burst_location.py", line 134, in create_plot
    plt.scatter(x, y, c=colors)
  File "C:\python3.6.6\lib\site-packages\matplotlib\pyplot.py", line 2793, in scatter
    verts=verts, edgecolors=edgecolors, data=data, **kwargs)
  File "C:\python3.6.6\lib\site-packages\matplotlib\__init__.py", line 1785, in inner
    return func(ax, *args, **kwargs)
  File "C:\python3.6.6\lib\site-packages\matplotlib\axes\_axes.py", line 4223, in scatter
    .format(nc=n_elem, xs=x.size, ys=y.size)
ValueError: 'c' argument has 64800 elements, which is not acceptable for use with 'x' with size 64800, 'y' with size 64800.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Возможно, было бы более целесообразно построить график, используя что-то вроде imshow или pcolormesh Это создает «тепловую карту» в сетке с координатами x, y. Сетка x, y является необязательной для этих функций.

colors = np.arange(64800)

plt.pcolormesh(colors.reshape(360, 180).T)
# OR #
x, y = np.meshgrid(range(0, 360), range(-90, 90))
plt.pcolormesh(x, y, colors.reshape(360, 180).T)

enter image description here

Вы должны обратить внимание на то, как вы меняете форму colors. Вы можете заполнить либо по строкам или по столбцам. По умолчанию используются строки (последняя ось). Это также важно отметить в другом ответе, когда вы выравниваете свою сетку.

0 голосов
/ 08 января 2019

Проблема в ваших x и y данных, а не в параметре colors c. Ваши x и y в настоящее время являются 2d массивом (meshgrid). Это должен быть список позиций. Один из способов сделать это состоит в том, чтобы сгладить ваши 2-мерные сетки, чтобы получить 1-й массив. Однозначное соответствие между точками данных x и y будет сохранено. Сетки сетки работают нормально для рассеянных 3D-графиков.

Я выбираю несколько случайных цветов, чтобы найти решение.

x, y = np.meshgrid(range(0, 360), range(-90, 90))
colors = np.random.random(360*180)
plt.scatter(x.flatten(), y.flatten(), c=colors)
plt.colorbar()

enter image description here

...