фрейм данных на основе holoviews по размеру и маркеру - PullRequest
0 голосов
/ 13 мая 2019

Как разбросать данные графика в кадре данных со столбцами x, y, label_color, label_marker, чтобы x, y были координатами, одинаковые значения label_color дают одинаковые цвета (или label_color является цветом), а один и тот же label_marker дает одинаковый маркер (илиlabel_marker - это символ маркера).В идеале легенда должна иметь некоторую информацию об этой маркировке на нескольких продуктах.

Я пробовал df.hvplot.scatter(x="x", y="y", c="label_color"), и это прекрасно работает.Я попытался использовать s = "label_size" вместо маркеров, но я бы предпочел иметь четкую маркировку [pan].Это также дает странную легенду.Далее я попытался df.hvplot(kind="points", x="1",y="2", c="label_color", s="label_size", by="other_label").

Например,

df = pd.DataFrame([[1, 1, "a", "A"], 
                   [2, 2, "a", "B"], 
                   [3,3, "b", "C"],
                   [3,4, "b", "C"]], columns=["x", "y", "color_label", "marker_label"])
scatter_by_color_and_marker(df).redim.range(x=(0,5), y=(0,5))

Обновление: я реализовал следующее.Более простые реализации / улучшения приветствуются

class PianoIter(object):
    def __init__(self, max_iter=100):
        self.max_iter = max_iter
    def __iter__(self):
        self.a = 1
        return self
    def next(self):
        x = self.a
        self.a += 1
        if x>self.max_iter:
            raise Exception("too large iteration")
        return x

from itertools import cycle as Cycle
class DictCycle(dict):
    def __init__(self, d=None, cycle=None):
        d = d if d is not None else {}
        super(DictCycle, self).__init__(d)
        self.fixed_keys = d.keys()
        self.cycle = Cycle(cycle) if cycle is not None else iter(PianoIter())
    def __getitem__(self, label):
        if label not in self:
            value = next(self.cycle)
            self[label] = value
            return value
        else:
            return self.get(label)
def scatter_by_color_and_marker(df, x_label="x", y_label="y", color_label="color_label", marker_label="marker_label", color_dict=None, marker_dict=None):
    color_dict = DictCycle(d=color_dict, cycle=hv.Cycle().values)
    marker_dict = DictCycle(d=marker_dict, cycle=["o", "+", "d", "*", "s", "v", "^", "<", ">", "x"])
    l = []
    for (c_l, m_l), df_i in df.groupby([color_label, marker_label]):
        c = color_dict[c_l]
        m = marker_dict[m_l]
        l.append(df_i.hvplot.scatter(x=x_label, y=y_label).options(color=c, marker=m))
    for c_l, c in color_dict.items():
        l.append(hv.Curve([], label="C "+str(c_l)).opts(line_color=c))
    for m_l, m in marker_dict.items():
        l.append(hv.Points([None,None], label="M "+str(m_l)).opts(marker=m, color="black"))
    return hv.Overlay(l)
...