Python .txt файл с номерами в rgba

1

Может ли кто-нибудь помочь мне с моим проектом? Я хотел бы сохранить данные с нескольких датчиков температуры через регистратор данных в файл, а затем проанализировать это с помощью программы Python. Это моя проблема. После обработки данных создайте интерактивную трехмерную карту, которая использует измерения датчиков в качестве цветовой градации.

Я сожалею заранее, если я что-то пропустил или не предоставил достаточной информации. Это мой первый вопрос, который я задаю здесь. Раньше я не работал с Python, поэтому я все еще "noob".

В приложении У меня есть текущий код. Я надеюсь, что это очевидно, что я хочу, но ошибка, которую я получаю, когда я хочу использовать данные в TXT файле для RGB/RGBA:

10., 20., 30., 40., 50., 60., 50., 60., 50., 40., 30., 20., 10. → Неверный аргумент RGBA: nan или, если у меня есть он преобразуется в массив Недопустимый аргумент RGBA: 0.0

Я узнал, что значения RGB могут обрабатываться только между 0.0 и 1.0, но мой "цветной" массив был в порядке (см. Код)

Я не вижу ошибки. Я надеюсь, что кто-то может помочь. Заранее спасибо.

/Minimal: (где может быть ошибка)

import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D, get_test_data
from matplotlib import cm
import numpy as np 

fig = plt.figure(figsize=plt.figaspect(1))
ax = fig.add_subplot(1, 1, 1, projection='3d')

data_file = np.genfromtxt('data_file.txt', delimiter=',')
color = mpl.colors.to_rgba_array(data_file[:,0], alpha=None)

c = np.abs(color)
cmhot = plt.get_cmap("hot")
ax.scatter(X, Y, Z, color, s=50, c=c, cmap=cmhot)

/Полный код:

import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D, get_test_data
from matplotlib import cm
import numpy as np
import pandas as pd
from pandas import DataFrame 


# set up a figure
fig = plt.figure(figsize=plt.figaspect(1))

ax = fig.add_subplot(1, 1, 1, projection='3d')

########################the part not working#########################

# load the data file
data_file = np.genfromtxt('data_file.txt', delimiter=',')

#possible processing / not working
#data_file = np.array(data_file)
#data_file = (data_file-min(data_file))/(max(data_file)-min(data_file))

# parse good sensor data from imported data
color = mpl.colors.to_rgba_array(data_file[:,0], alpha=None)

########################the part not working#########################

arrA = ([[ -4. ],
         [ 0. ],
         #...etc.
         [ 0. ],
         [ 4. ]])

arrB = ([[ -4. ],
         [ -4. ],
         #...etc.
         [ 4. ],
         [ 4. ]])

arrC = ([[ -30. ],
         [ -30. ],
         #...etc.
         [ -30. ],
         [ -30. ]])

#color = ([ 0. , 10. , 20. , 30. , 40. , 50. , 60. , 50. , 40. , 30. , 20. , 10. , 0. ])

arrA = np.array(arrA)
arrB = np.array(arrB)
arrC = np.array(arrC)

data_arrays = (arrA, arrB, arrC)

X, Y, Z = data_arrays


#ax.plot_wireframe(X, Y, Z, rstride=1, cstride=1, cmap='inferno')


c = np.abs(color)
cmhot = plt.get_cmap("hot")
ax.scatter(X, Y, Z, color, s=50, c=c, cmap=cmhot)

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z');
plt.show()

/.txt файл

0. , 10. , 20. , 30. , 40. , 50. , 60. , 50. , 40. , 30. , 20. , 10. , 0.
10. , 20. , 30. , 40. , 50. , 60. , 50. , 60. , 50. , 40. , 30. , 20. , 10.
20. , 30. , 40. , 50. , 60. , 50. , 40. , 50. , 60. , 50. , 40. , 30. , 10.
40. , 50. , 60. , 50. , 40. , 30. , 20. , 30. , 40. , 50. , 60. , 50. , 40.
60. , 50. , 40. , 30. , 20. , 10. , 0. , 10. , 20. , 30. , 40. , 50. , 60.
#... etc.

/Ошибка:

KeyError                                  Traceback (most recent call last)
c:\users\te291095\appdata\local\programs\python\python36-32\lib\site-packages\matplotlib\colors.py in to_rgba(c, alpha)
    165     try:
--> 166         rgba = _colors_full_map.cache[c, alpha]
    167     except (KeyError, TypeError):  # Not in cache, or unhashable.

KeyError: (nan, None)

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-26-8ef706d1f4cb> in <module>()
     31 
     32 # parse good sensor data from imported data
---> 33 color = mpl.colors.to_rgba_array(data_file[:,0], alpha=None)
     34 #color = data_file[:,0]
     35 # display the first 16 sensor rows

c:\users\te291095\appdata\local\programs\python\python36-32\lib\site-packages\matplotlib\colors.py in to_rgba_array(c, alpha)
    265     result = np.empty((len(c), 4), float)
    266     for i, cc in enumerate(c):
--> 267         result[i] = to_rgba(cc, alpha)
    268     return result
    269 

c:\users\te291095\appdata\local\programs\python\python36-32\lib\site-packages\matplotlib\colors.py in to_rgba(c, alpha)
    166         rgba = _colors_full_map.cache[c, alpha]
    167     except (KeyError, TypeError):  # Not in cache, or unhashable.
--> 168         rgba = _to_rgba_no_colorcycle(c, alpha)
    169         try:
    170             _colors_full_map.cache[c, alpha] = rgba

c:\users\te291095\appdata\local\programs\python\python36-32\lib\site-packages\matplotlib\colors.py in _to_rgba_no_colorcycle(c, alpha)
    217         # float)' and 'np.array(...).astype(float)' all convert "0.5" to 0.5.
    218         # Test dimensionality to reject single floats.
--> 219         raise ValueError("Invalid RGBA argument: {!r}".format(orig_c))
    220     # Return a tuple to prevent the cached value from being modified.
    221     c = tuple(c.astype(float))

ValueError: Invalid RGBA argument: nan

/Подтверждаемый:

Код shouold считывает данные из файла и обрабатывает его как цвет для точек в разбросе.

Если вы читаете три строки вручную без файла и просто сохраняете его как массив, он работает (см. Рисунок ниже), поэтому я не понимаю, почему это не сработает, когда я получу данные из файла.

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

  • 1
    Рекомендуется размещать на английском. stackoverflow.blog/2009/07/23/non-english-question-policy
  • 0
    Извините код не очень понятен, но я уже перепробовал множество возможных решений
Показать ещё 5 комментариев
Теги:
matplotlib
arrays
3d

2 ответа

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

проблема, о которой вы сообщаете, mpl.colors.to_rgba_array с: mpl.colors.to_rgba_array который ожидает массив значений цвета Matplotlib, а не чисел с плавающей запятой.

Посмотрите здесь: https://matplotlib.org/api/colors_api.html#module-matplotlib.colors

А также посмотрите на следующий пост: как сопоставить номер с цветом с использованием шаблона matplotlib?

вы можете исправить это, изменив его на что-то вроде следующего (обратите внимание на произвольные значения vmin и vmax, которые я выбрал):

norm = mpl.colors.Normalize(vmin=0, vmax=60)
cmap = cm.hot
m = cm.ScalarMappable(norm=norm, cmap=cmap)
map_to_color = np.vectorize(m.to_rgba)

# parse good sensor data from imported data
color = map_to_color(data_file[:, 0])

Есть дополнительные проблемы с образцом, который вы опубликовали, относительно размеров того, что вы передаете ax.scatter но я уверен, что вы можете быстро исправить это самостоятельно.

Редактировать:

Посмотрев еще раз на matplotlib.pyplot.scatter(https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html), вот самый быстрый способ заставить ваш пример работать.

удалите неисправную линию:

color = mpl.colors.to_rgba_array(data_file[:,0], alpha=None)

и замените блок:

c = np.abs(color)
cmhot = plt.get_cmap("hot")
ax.scatter(X, Y, Z, color, s=50, c=c, cmap=cmhot)

с:

values = data_file[:4, 0]
ax.scatter(X, Y, Z, c=values, cmap="hot")

data_file[:4, 0] вместо data_file[:, 0] чтобы убедиться, что размерность ваших входных данных x и y (n = 4) соответствует размерности цветов/значений, переданных в c (что также должно быть длина n)

  • 0
    Спасибо за быстрый ответ. Я постараюсь исправить это как можно скорее и доложу.
  • 0
    Я пытался внедрить его в мой код, но все равно получаю ошибку, что он не будет обрабатывать массив. непроходимый тип: 'numpy.ndarray' Теперь появилась новая ошибка: c формы (4, 16, 13) не приемлем в качестве цветовой последовательности для x с размером 13, y с размером 13. Я изменил color = map_to_color (data_file [:, 0]) to color = map_to_color (data_file [:, 0:13]) Это правильно? Может быть, что-то не так с np.abs ()?
Показать ещё 3 комментария
0

Спасибо @stakka за ответ. Теперь я сокращаю код и удаляю все, что не нужно. Теперь это выглядит так и прекрасно работает:

import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D, get_test_data
from matplotlib import cm
import numpy as np

# set up a figure
fig = plt.figure(figsize=plt.figaspect(1))

# add the projection
ax = fig.add_subplot(1, 1, 1, projection='3d')

# load the data file
data_file = np.genfromtxt('data_file_noarr.txt', delimiter=',')

arrA = ([[0],[2],[4],[0],[2],[4],[0],[2],[4]])
arrB = ([[0],[0],[0],[2],[2],[2],[4],[4],[4]])

arrA = np.array(arrA)
arrB = np.array(arrB)

#          <-- Lowest Plot to Highest Plot loop -->
#################################################################

count = 0
cmhot = plt.get_cmap("hot")

while count < 10:
    values = data_file[0:9, count]
    arrC = np.full((9, 1), count)
    arrC = np.array(arrC)
    data_arrays = (arrA, arrB, arrC)
    X, Y, Z = data_arrays
    ax.scatter(X, Y, Z, c=values, cmap=cmhot)
    count = count + 1

#################################################################

ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z');
plt.show()

/Выход:

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

  • 0
    чтобы ответить на ваш вопрос о прозрачных точках: вы можете избежать этого, передав альфа = 1 вызову matplotlib.pyplot.scatter. Я также хотел бы отметить, что если вы знаете точное количество необходимых итераций, вы должны использовать цикл for вместо цикла while. Просто напишите: for count in range(10):
  • 0
    Да уж. Спасибо. Я не привык к синтаксису for, поэтому я просто использовал while. Но спасибо за исправление с прозрачностью.

Ещё вопросы

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