#python #matplotlib
#питон #matplotlib
Вопрос:
У меня есть 2 переменные (x, y), которые меняются со временем (t). Я хочу построить график зависимости x от t и раскрасить тики в зависимости от значения y. например, для самых высоких значений y цвет тика — темно-зеленый, для самого низкого значения — темно-красный, а для промежуточных значений цвет будет масштабироваться между зеленым и красным.
Можно ли это сделать с помощью matplotlib в python?
Ответ №1:
Это то matplotlib.pyplot.scatter
, для чего нужно.
Если цветовая карта не указана, scatter
будет использоваться любая цветовая карта по умолчанию. Чтобы указать, какой разброс цветовой карты следует использовать, используйте cmap
kwarg (например cmap="jet"
).
В качестве краткого примера:
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import numpy as np
# Generate data...
t = np.linspace(0, 2 * np.pi, 20)
x = np.sin(t)
y = np.cos(t)
plt.scatter(t, x, c=y, ec='k')
plt.show()
Можно указать пользовательскую цветовую карту и норму
cmap, norm = mcolors.from_levels_and_colors([0, 2, 5, 6], ['red', 'green', 'blue'])
plt.scatter(x, y, c=t, cmap=cmap, norm=norm)
Комментарии:
1. Большое вам спасибо. Я ценю ваш быстрый ответ.
Ответ №2:
Если вы хотите построить линии вместо точек, смотрите Этот пример, измененный здесь для построения хороших / плохих точек, представляющих функцию в виде черного / красного, в зависимости от обстоятельств:
def plot(xx, yy, good):
"""Plot data
Good parts are plotted as black, bad parts as red.
Parameters
----------
xx, yy : 1D arrays
Data to plot.
good : `numpy.ndarray`, boolean
Boolean array indicating if point is good.
"""
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
from matplotlib.colors import from_levels_and_colors
from matplotlib.collections import LineCollection
cmap, norm = from_levels_and_colors([0.0, 0.5, 1.5], ['red', 'black'])
points = np.array([xx, yy]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
lines = LineCollection(segments, cmap=cmap, norm=norm)
lines.set_array(good.astype(int))
ax.add_collection(lines)
plt.show()