Сюжет скрипки matplotlib / seaborn с цветовой картой

Я хочу создать скрипичный сюжет с помощью matplotlib или searborn, в котором сюжет окрашен в соответствии с цветовой картой.

Вот что я получаю:

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

Вот что я хотел бы получить (здесь я использовал Photoshop): введите здесь описание изображения

Как я могу получить желаемый сюжет?


person Nisba    schedule 02.08.2019    source источник
comment
Цветовая карта предназначена только для эстетики или важно отображение? Вы хотите, чтобы цвет был масштабирован до значений оси Y или что-то еще?   -  person Diziet Asahi    schedule 02.08.2019
comment
отображение важно, я использую его, чтобы сравнить сюжет скрипки с некоторыми другими сюжетами   -  person Nisba    schedule 02.08.2019
comment
Но в этом случае вы хотели бы сообщить людям, какое количество вы хотите сопоставить с цветами.   -  person ImportanceOfBeingErnest    schedule 02.08.2019
comment
Значение цветов объясняется цветовой картой, в любом случае важно, как распределяются цвета, которые используются в других сюжетах (поэтому я использую скрипичный сюжет)   -  person Nisba    schedule 02.08.2019
comment
Не уверен, что понимаю это; поэтому единственное, что я могу здесь сказать, это то, что вам нужно будет создать imshow с желаемым сопоставлением и использовать контуры скрипки как clip_path к изображению.   -  person ImportanceOfBeingErnest    schedule 02.08.2019


Ответы (1)


Я думал, что было бы лучше сделать это, но, основываясь на комментарии @ImportanceOfBeingErnest, я думаю, что на самом деле это правильный путь:

from matplotlib.path import Path
from matplotlib.patches import PathPatch
from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable


x = [np.random.normal(loc=i, scale=1, size=(100,)) for i in range(5)]

fig, ax = plt.subplots()
violins = ax.violinplot(x)

ymin, ymax = ax.get_ylim()
xmin, xmax = ax.get_xlim()

# create a numpy image to use as a gradient
Nx,Ny=1,1000
imgArr = np.tile(np.linspace(0,1,Ny), (Nx,1)).T
cmap = 'hsv'

for violin in violins['bodies']:
    path = Path(violin.get_paths()[0].vertices)
    patch = PathPatch(path, facecolor='none', edgecolor='none')
    ax.add_patch(patch)
    img = ax.imshow(imgArr, origin="lower", extent=[xmin,xmax,ymin,ymax], aspect="auto",
                    cmap=cmap,
                    clip_path=patch)

# colorbar
ax_divider = make_axes_locatable(ax)
cax = ax_divider.append_axes("right", size="5%", pad="2%")
norm = matplotlib.colors.Normalize(vmin=ymin, vmax=ymax)
cb = matplotlib.colorbar.ColorbarBase(cax, cmap=matplotlib.cm.get_cmap(cmap),
                                norm=norm,
                                orientation='vertical')

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

person Diziet Asahi    schedule 02.08.2019
comment
Как я мог получить также вертикальную полосу сбоку от графика, показывающую цветовой градиент? Я пытался добавить прямоугольник, но он не работает, я думаю, что у меня должен быть патч, который является обратным прямоугольнику. - person Nisba; 23.02.2020
comment
Конечно, вы можете создать цветовую полосу, используя ColorbarBase и соответствующую нормализацию. я изменил свой ответ - person Diziet Asahi; 23.02.2020