Код: Выделить всё
import matplotlib.pyplot as pyplot
import numpy
vis_mv(data, ax = None):
if ax is None: ax = pyplot.gca()
cmap = pyplot.get_cmap()
colors = cmap(numpy.linspace(0, 1, len(data)))
xs = numpy.arange(len(data)) + 1
means = numpy.array([ numpy.mean(x) for x in data ])
varis = numpy.array([ numpy.var(x) for x in data ])
vlim = max(1, numpy.amax(varis))
# variance
ax.imshow([[0.,1.],[0.,1.]],
cmap = cmap, interpolation = 'bicubic',
extent = (1, len(data), -vlim, vlim), aspect = 'auto'
)
ax.fill_between(xs, -vlim, -varis, color = 'white')
ax.fill_between(xs, varis, vlim, color = 'white')
# mean
ax.plot(xs, means, color = 'white', zorder = 1)
ax.scatter(xs, means, color = colors, edgecolor = 'white', zorder = 2)
return ax

но теперь я хотел бы иметь возможность использовать эту визуализацию также и вертикально, как своего рода расширенную цветовую полосу рядом с другим сюжетом. Я надеялся, что можно будет повернуть всю ось со всем ее содержимым,
но смог найти только этот вопрос, на который пока тоже нет однозначного ответа. Поэтому я попробовал сделать это сам следующим образом:
Код: Выделить всё
from matplotlib.transforms import Affine2D
ax = vis_mv()
r = Affine2D().rotate_deg(90) + ax.transData
for x in ax.images + ax.lines + ax.collections:
x.set_transform(r)
old = ax.axis()
ax.axis(old[2:4] + old[0:2])

К сожалению, PathCollection содержит результат разброса< /code>ing работает не так, как ожидалось. Попробовав некоторые вещи, я обнаружил, что в scatter есть своего рода преобразование смещения, которое, похоже, является эквивалентом обычного преобразования в других коллекциях.
Код: Выделить всё
x = numpy.arange(5)
ax = pyplot.gca()
p0, = ax.plot(x)
p1 = ax.scatter(x,x)
ax.transData == p0.get_transform() # True
ax.transData == p1.get_offset_transform() # True
Кто-нибудь знает, существует ли возможность изменить преобразование смещения?
Подробнее здесь: https://stackoverflow.com/questions/438 ... matplotlib