Я пытаюсь сопоставить 3-ю переменную с цветом точки рассеивания в Seaborn lmplot. Итак, total_bill
по x, tip
по y и цвет точки как функция size
.Как передать разброс kwargs на грани в lmplot в Seaborn
Он работает, если огнетушение не активировано, но не выполняется, когда используется col
, потому что размер цветовой гаммы не соответствует размеру данных, нанесенных на каждый грань.
Это мой код
import matplotlib as mpl
import seaborn as sns
sns.set(color_codes=True)
# load data
data = sns.load_dataset("tips")
# size of data
print len(data.index)
### we want to plot scatter point colour as function of variable 'size'
# first, sort the data by 'size' so that high 'size' values are plotted
# over the smaller sizes (so they are more visible)
data = data.sort_values(by=['size'], ascending=True)
scatter_kws = dict()
cmap = mpl.cm.get_cmap(name='Blues')
# normalise 'size' variable as float range needs to be
# between 0 and 1 to map to a valid colour
scatter_kws['c'] = data['size']/data['size'].max()
# map normalised values to colours
scatter_kws['c'] = cmap(scatter_kws['c'].values)
# colour array has same size as data
print len(scatter_kws['c'])
# this works as intended
g = sns.lmplot(data=data, x="total_bill", y="tip", scatter_kws=scatter_kws)
Вышеприведенные хорошо работает и производит следующее (не разрешено включать в себя изображения еще, так вот ссылка):
lmplot with point colour as function of size
Однако, когда я добавьте col='sex'
в lmplot (попробуйте код ниже), проблема заключается в том, что массив цветов имеет размер исходного набора данных, который больше размера данных, нанесенных на каждый грань. Так, например, col='male'
имеет 157 точек данных, поэтому первые 157 значений из массива цветов отображаются в точки (и это даже не правильные). Смотрите ниже:
lmplot with point colour as function of size
with col=sex
g = sns.lmplot(data=data, x="total_bill", y="tip", col="sex", scatter_kws=scatter_kws)
В идеале, я хотел бы передать массив scatter_kws в lmplot так, что каждая грань использует правильный массив цвета (который я бы вычислить, прежде чем перейти к lmplot) , Но это не похоже на выбор.
Любые другие идеи или обходные пути, которые все еще позволяют мне использовать функциональность Сиборн в lmplot
(смысл, не прибегая к Воссоздание lmplot
функциональность от FacetGrid
?
Я не совсем понимаю, что вы пытаетесь достичь. Возможно, это помогло бы, если бы вы обновили вопрос, четко указав, какие столбцы блока данных следует использовать для какого типа визуализации. – ImportanceOfBeingErnest
Отредактировано для наглядности. Спасибо :) – pistachio
Я не думаю, что то, о чем вы просите, легко возможно, так как 'scatter_kws' одновременно передаются обоим диаграммам рассеяния, которые имеют (возможно) разное количество точек. Что такое функциональность от 'lmplot', которая вам нужна? – ImportanceOfBeingErnest