Вопрос или проблема
У меня есть график с x размером 180 и y размером 36, 180. Таким образом, у меня 36 линий, когда я вызываю plot. Как мне установить первые 30 линий в синий цвет, а последние шесть в красный, не используя цикл?
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 180)
y = np.random.rand(36, 180)
colors = ['blue'] * 30 + ['red'] * 6
plt.plot(x, y.T, color=colors)
plt.show()
Однако это вызывает следующую ошибку:
ValueError: ['blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'red', 'red', 'red', 'red', 'red', 'red'] не является допустимым значением для цвета
Ответ или решение
Для того чтобы задать цвета для линий в Matplotlib без использования цикла, вам нужно воспользоваться параметром color
функции plot
, в который можно передать массив цветов. Однако, если вы хотите передать список цветов, необходимо учитывать формат, который принимает Matplotlib. Ваша ошибка возникает из-за неправильного формата списка цветов.
В вашем случае, вы можете использовать 2D массив для указания цветов, которые будут соответствовать каждому из 36 графиков. Вот пример исправленного кода:
import numpy as np
import matplotlib.pyplot as plt
# Генерация данных
x = np.linspace(0, 10, 180)
y = np.random.rand(36, 180)
# Создание списка цветов
colors = ['blue'] * 30 + ['red'] * 6
# Использование метода plot с указанием цвета
for i in range(y.shape[0]):
plt.plot(x, y[i], color=colors[i])
# Показать график
plt.show()
В данном примере мы итерируемся по каждой строке массива y
и задаем соответствующий цвет из списка colors
для каждой линии. Хотя это и использует цикл, это наиболее эффективный способ указания цвета для графиков в Matplotlib.
Если вам нужно делать это без явного цикла, можно воспользоваться функцией numpy
для поддержки векторизации и более удобной обработки:
import numpy as np
import matplotlib.pyplot as plt
# Генерация данных
x = np.linspace(0, 10, 180)
y = np.random.rand(36, 180)
# Создание списка цветов
colors = np.array(['blue'] * 30 + ['red'] * 6)
# Использование срезов для разделения на группы цветов
plt.plot(x, y[:30].T, color='blue') # Первые 30 линий
plt.plot(x, y[30:].T, color='red') # Остальные 6 линий
# Показать график
plt.show()
В этом варианте, мы сначала строим синие линии (первые 30) и затем красные линии (последние 6), что позволяет избежать необходимости в использовании полного цикла, что может повысить читаемость кода.
Таким образом, вы можете легко задавать разные цвета для вашего графика в зависимости от количества линий.