Как создать шаблоны для цветной панели в Biokit / corrplot - PullRequest
0 голосов
/ 23 января 2020

Интересно, можно ли с corrplot (из пакета biokit) иметь колобар с узорами. В приведенном ниже примере для колобара я хотел бы иметь 5 пузырьков с разными размерами, связанных со значениями матрицы ([-1, -0,5, 0, +0,5, +1]).

Идеи? большое спасибо

import numpy as np
import pandas as pd
from biokit.viz import corrplot
from matplotlib import pyplot as plt
import string

letters = string.ascii_uppercase[0:15]
df = pd.DataFrame(dict(( (k, np.random.random(10)+ord(k)-65) for k in letters)))
df = df.corr()

c = corrplot.Corrplot(df)

c.plot(colorbar=True, upper='circle', rotation=60, cmap='Oranges', fontsize=12)

plt.tight_layout()
plt.show()

1 Ответ

0 голосов
/ 23 января 2020

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

Кажется, сначала нужно создать несколько кругов, для которых цвет et c , можно установить. Чтобы сказать обработчику, какая именно форма подразумевается, я неправильно использую параметр label. Из источника биокита corrplot мы узнаем, что эллипс вращается либо +, либо -45°, и что он масштабируется по абсолютной величине корреляции.

Следующий код собирает все вместе. Цветовая шкала рисуется как ссылка, но может быть опущена после того, как все проверено. Легенда расположена вне основного сюжета через bbox_to_anchor=(x, y). Эти координаты находятся в координатах осей . Идеальное расположение зависит от размера других элементов, поэтому некоторые эксперименты могут быть полезны. Я не нарисовал сам corrplot, так как он не установлен, но вы можете заменить им фиктивный график рассеяния.

import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse, Circle
import matplotlib as mpl

class HandlerEllipse(mpl.legend_handler.HandlerPatch):
    def create_artists(self, legend, orig_handle,
                       xdescent, ydescent, width, height, fontsize, trans):
        d = float(orig_handle.get_label())
        center = 0.5 * width - 0.5 * xdescent, 0.5 * height - 0.5 * ydescent
        radius = (height + ydescent) * 1.8
        p = Ellipse(xy=center, width=radius, height=radius * (1 - abs(d)), angle=45 if d > 0 else -45)
        self.update_prop(p, orig_handle, legend)
        p.set_transform(trans)
        return [p]

#values = [1, 0.5, 0, -0.5, -1]
values = [1, 0.75, 0.5, 0.25, 0, -0.25, -0.5, -0.75, -1]

cmap = plt.cm.Oranges  # or plt.cm.PiYG
norm = mpl.colors.Normalize(vmin=-1, vmax=1)

fig, ax = plt.subplots()

plt.scatter([0,1], [0,1], c=[-1,1], cmap=cmap, norm=norm)  # a dummy plot as a stand-in for the corrplot
char = plt.colorbar(ticks=values)

shapes = [Circle((0.5, 0.5), 1, facecolor=cmap(norm(d)), edgecolor='k', alpha=1, zorder=2, linewidth=1, label=d)
          for d in values]
plt.legend(handles=shapes, labels=values, title='Correlation', framealpha=1,
           bbox_to_anchor=(1.25, 1), loc='upper left',
           handler_map={Circle: HandlerEllipse()})
plt.tight_layout() # make sure legend and colorbar fit nicely in the plot
plt.show()

resulting legend

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...