#python #matplotlib
#python #matplotlib
Вопрос:
Когда я использовал matplotlib для рисования рисунка, метод scatter в pylot показал исключение.Информация об исключении выглядит следующим образом:
Exception has occurred: ValueError
'c' argument has 797 elements, which is not acceptable for use with 'x'
with size 797, 'y' with size 797.
File "D:legaoxiaowyplot.py", line 74, in <module>
plt.scatter(x, y, c=color)
версия python равна 3.6, matplotlib равен 3.0.2.
Я прочитал справочную документацию и не нашел конкретных ошибок. Пожалуйста, помогите мне разобраться, спасибо.
Мой код выглядит следующим образом:
import math
import matplotlib.pyplot as plt
# data
traces = {
'A': [(112, 36), (112, 45), (112, 52), (112, 54), (112, 63), (111, 73),
(111, 86), (111, 91), (111, 97), (110, 105)],
'B': [(119, 37), (120, 42), (121, 54), (121, 55), (123, 64), (124, 74),
(125, 87), (127, 94), (125, 100), (126, 108)],
'C': [(93, 23), (91, 27), (89, 31), (87, 36), (85, 42), (82, 49), (79,
59), (74, 71), (70, 82), (62, 86), (61, 92), (55, 101)],
'D': [(118, 30), (124, 83), (125, 90), (116, 101), (122, 100)],
'E': [(77, 27), (75, 30), (73, 33), (70, 37), (67, 42), (63, 47), (59,
53), (55, 59), (49, 67), (43, 75), (36, 85), (27, 92), (24, 97),
(20, 102)],
'F': [(119, 30), (120, 34), (120, 39), (122, 59), (123, 60), (124, 70),
(125, 82), (127, 91), (126, 97), (128, 104)],
'G': [(88, 37), (87, 41), (85, 48), (82, 55), (79, 63), (76, 74), (72,
87), (67, 92), (65, 98), (60, 106)],
'H': [(124, 35), (123, 40), (125, 45), (127, 59), (126, 59), (128, 67),
(130, 78), (132, 88), (134, 93), (135, 99), (135, 107)],
'I': [(98, 26), (97, 30), (96, 34), (94, 40), (92, 47), (90, 55), (87,
64), (84, 77), (79, 87), (74, 93), (73, 102)],
'J': [(123, 60), (125, 63), (125, 81), (127, 93), (126, 98), (125, 100)]
}
def get_vector(a, b):
"""Calculate vector (distance, angle in degrees) from point a to point
b.
Angle ranges from -180 to 180 degrees.
Vector with angle 0 points straight down on the image.
Values increase in clockwise direction.
"""
dx = float(b[0] - a[0])
dy = float(b[1] - a[1])
distance = math.sqrt(dx**2 dy**2)
if dy > 0:
angle = math.degrees(math.atan(-dx/dy))
elif dy == 0:
if dx < 0:
angle = 90.0
elif dx > 0:
angle = -90.0
else:
angle = 0.0
else:
if dx < 0:
angle = 180 - math.degrees(math.atan(dx/dy))
elif dx > 0:
angle = -180 - math.degrees(math.atan(dx/dy))
else:
angle = 180.0
return distance, angle
def count_distance():
'''Loop through the point data and calculate the result and color
values'''
x = []
y = []
c = []
red_c = (255, 0, 0)
blue_c = (0, 0, 255)
for group1 in traces.keys():
for index1, point1 in enumerate(traces[group1]):
for group2 in traces.keys():
for index2, point2 in enumerate(traces[group2]):
if point1 != point2 and index2 - index1 == 1:
t1, t2 = get_vector(point1, point2)
x.append(t2)
y.append(t1)
if group1 == group2:
c.append(blue_c)
else:
c.append(red_c)
return x, y, c
if __name__ == '__main__':
x, y, color = count_distance()
# print(len(x))
# exception here
plt.scatter(x, y, c=color)
plt.xlabel('Angle')
plt.ylabel('Distance')
plt.show()
Сначала я инициализировал пакет данных о движении (трассировки), а затем разработал функцию (get_vector) для вычисления расстояния между двумя точками. Функция count_distance ведет статистику расстояния до всех точек на трассах и цвета, который должен быть отображен. Ошибка кода в основном вызвана данными о цвете.
Комментарии:
1. интересно: github.com/matplotlib/matplotlib/issues/11373 Похоже, что это не должно вызывать эту ошибку. Попробуйте обновить свою библиотеку matplotlib
Ответ №1:
Matplotlib ожидает, что цвета RGB (A) будут указаны в диапазоне от 0.0 до 1.0, смотрите больше здесь. Приведенное ниже исправление изменяет цвета в пределах (0, 1). Кроме того, он использует метод set_color для объекта artist. Не совсем уверен, почему ваш код не должен работать. Я посмотрю на это.
РЕДАКТИРОВАТЬ: на самом деле это работает «из коробки» без заданной строки, но значения colorrs должны быть в пределах 0, 1!
import math
import matplotlib.pyplot as plt
# data
traces = {
'A': [(112, 36), (112, 45), (112, 52), (112, 54), (112, 63), (111, 73),
(111, 86), (111, 91), (111, 97), (110, 105)],
'B': [(119, 37), (120, 42), (121, 54), (121, 55), (123, 64), (124, 74),
(125, 87), (127, 94), (125, 100), (126, 108)],
'C': [(93, 23), (91, 27), (89, 31), (87, 36), (85, 42), (82, 49), (79,
59), (74, 71), (70, 82), (62, 86), (61, 92), (55, 101)],
'D': [(118, 30), (124, 83), (125, 90), (116, 101), (122, 100)],
'E': [(77, 27), (75, 30), (73, 33), (70, 37), (67, 42), (63, 47), (59,
53), (55, 59), (49, 67), (43, 75), (36, 85), (27, 92), (24, 97),
(20, 102)],
'F': [(119, 30), (120, 34), (120, 39), (122, 59), (123, 60), (124, 70),
(125, 82), (127, 91), (126, 97), (128, 104)],
'G': [(88, 37), (87, 41), (85, 48), (82, 55), (79, 63), (76, 74), (72,
87), (67, 92), (65, 98), (60, 106)],
'H': [(124, 35), (123, 40), (125, 45), (127, 59), (126, 59), (128, 67),
(130, 78), (132, 88), (134, 93), (135, 99), (135, 107)],
'I': [(98, 26), (97, 30), (96, 34), (94, 40), (92, 47), (90, 55), (87,
64), (84, 77), (79, 87), (74, 93), (73, 102)],
'J': [(123, 60), (125, 63), (125, 81), (127, 93), (126, 98), (125, 100)]
}
def get_vector(a, b):
"""Calculate vector (distance, angle in degrees) from point a to point
b.
Angle ranges from -180 to 180 degrees.
Vector with angle 0 points straight down on the image.
Values increase in clockwise direction.
"""
dx = float(b[0] - a[0])
dy = float(b[1] - a[1])
distance = math.sqrt(dx**2 dy**2)
if dy > 0:
angle = math.degrees(math.atan(-dx/dy))
elif dy == 0:
if dx < 0:
angle = 90.0
elif dx > 0:
angle = -90.0
else:
angle = 0.0
else:
if dx < 0:
angle = 180 - math.degrees(math.atan(dx/dy))
elif dx > 0:
angle = -180 - math.degrees(math.atan(dx/dy))
else:
angle = 180.0
return distance, angle
def count_distance():
'''Loop through the point data and calculate the result and color
values'''
x = []
y = []
c = []
red_c = (1, 0, 0)
blue_c = (0, 0, 1)
for group1 in traces.keys():
for index1, point1 in enumerate(traces[group1]):
for group2 in traces.keys():
for index2, point2 in enumerate(traces[group2]):
if point1 != point2 and index2 - index1 == 1:
t1, t2 = get_vector(point1, point2)
x.append(t2)
y.append(t1)
if group1 == group2:
c.append(blue_c)
else:
c.append(red_c)
return x, y, c
if __name__ == '__main__':
x, y, color = count_distance()
# print(len(x))
# exception here
h = plt.scatter(x, y, c = color)
plt.xlabel('Angle')
plt.ylabel('Distance')
plt.show()
Комментарии:
1. @flyonok (подсказка, щелкните стрелку вверх в ответе, если это помогло вам!)
2. Прошу прощения, моя РЕПУТАЦИЯ ниже пятнадцати. Когда у меня будет достаточно условий, я добавлю. @GlobalTravele
Ответ №2:
plt.scatter(x, y, c=color)
поскольку вы используете c = color, ожидается значение factor (категориальная переменная только с определенными уровнями). Ошибка говорит сама за себя, Произошло исключение: аргумент ValueError ‘c’ содержит 797 элементов, что неприемлемо для использования с ‘x’ размером 797, ‘y’ размером 797.
Это означает, что matplotlib не позволит использовать переменную с равным уровнем x и y. Просто удалите c = colors и попробуйте отобразить ее, это должно сработать.