Передача цветов в matplotlib в виде списка

Вопрос или проблема

У меня есть график с 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), что позволяет избежать необходимости в использовании полного цикла, что может повысить читаемость кода.

Таким образом, вы можете легко задавать разные цвета для вашего графика в зависимости от количества линий.

Оцените материал
Добавить комментарий

Капча загружается...