Как построить линейный график matplotlib с использованием цветовой карты?

Как я могу создать линейный график с помощью python matplotlib таким образом, чтобы цвет линии менялся в зависимости от другой серии?

Для простого примера:

import numpy as np
import matplotlib.pyplot as plt

t = np.arange(0.0, 2.0, 0.01)
y = np.sin(2 * np.pi * t)
z = (t-1) ** 2

fig = plt.figure()
ax = plt.axes()
ax.plot(t, y)
ax.plot(t, z)
plt.show()

Вместо:

линейные графики

Я хотел бы отображать только (t, y) таким образом, чтобы цвет линии представлял значение z после определенной карты цветов (cmap), например, «плазма».

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

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

Он ближе к этому примеру, как указано в комментариях, но я искал для чего-то более простого, чем создавать набор сегментов линий и раскрашивать их по отдельности.


person JPM    schedule 19.10.2018    source источник
comment
Похоже, что пример multicolored_line не очень прослеживается. Можете ли вы помочь нам и сказать, какие понятия вы использовали в своей поисковой системе, которые не привели бы к появлению этого всплывающего окна?   -  person ImportanceOfBeingErnest    schedule 19.10.2018
comment
Спасибо за интерес, @ImportanceOfBeingErnest. Я мог бы добраться до примера multicolored_line и раньше, но создайте набор отрезков линии, чтобы мы могли раскрасить их по отдельности. Это создает точки в виде массива N x 1 x 2, чтобы мы могли легко складывать точки вместе, чтобы получить сегменты. Массив сегментов для коллекции строк должен быть (numlines) x (количество точек в строке) x 2 (для x и y) похоже на хак. Я думал, что может существовать несколько простой и прямой способ...   -  person JPM    schedule 19.10.2018
comment
Понимаю. Что ж, в следующий раз, когда будете задавать здесь вопрос, упоминайте такие вещи, которые вы нашли. Это поможет вам получить лучшие ответы. Итак, у вас есть предложение, как сформулировать это по-другому? Конечно, есть идея иметь функцию-обертку, которая создает такую ​​коллекцию строк, но никто еще не работал над этим.   -  person ImportanceOfBeingErnest    schedule 19.10.2018
comment
Этот вопрос может представлять интерес, если вы не хотят видеть отдельные сегменты в сюжете. Appart, я не знаю, что значит проще. Если у вас есть четкое представление о том, чего вы ожидаете, вы, конечно, можете описать это как можно подробнее, и мы сможем снова открыть вопрос?   -  person ImportanceOfBeingErnest    schedule 19.10.2018
comment
Концептуально нет других вариантов, кроме раскрашивания сегментом линии, т.е. интерполировано, чтобы сгладить цветовые переходы из этого, как ваша забота. См. Также последний комментарий в этом ответе.   -  person Ethan Coon    schedule 19.10.2018
comment
stackoverflow.com/questions/10252412 действительно может быть лучшим дубликатом (поскольку он использует t в качестве независимой переменной), но я все еще немного не понимаю, какой здесь желаемый ответ.   -  person ImportanceOfBeingErnest    schedule 19.10.2018


Ответы (2)


Использование функции colorline со ссылкой на в ответе на вопрос, который вы сказали, это не дубликат этого, это можно сделать:

from colorline import colorline

colorline(t, y, z)
plt.xlim(t.min(), t.max())
plt.ylim(y.min(), y.max())
plt.show()

введите здесь описание изображения

Это создает несколько сегментов линии, каждый из которых имеет цвет, определенный z.

person Graipher    schedule 19.10.2018
comment
Видите, проблема в повторном открытии вопроса. Вы получаете одинаковые повторяющиеся ответы. :-( - person ImportanceOfBeingErnest; 19.10.2018
comment
@ImportanceOfBeingErnest: Но в каком смысле эта часть не отвечает на заданный вопрос? Это это немного другой ответ, чем на другой вопрос (для которого OP другого ответа должен был принять эту функцию, тогда как он был непосредственно предназначен для решения такой проблемы). - person Graipher; 19.10.2018

Я не думаю, что есть простой способ сделать это с линейными графиками, но с разбросом это довольно просто. Если вам все еще нужна соединительная линия, вы можете немного сымитировать ее с помощью серой линии позади нее:

ax.scatter(t, y, c=z, marker='.')
ax.plot(t, y, c='gray')

введите код здесь

person Randy    schedule 19.10.2018