Seaborn Kdeplot Colorbar - PullRequest
       44

Seaborn Kdeplot Colorbar

0 голосов
/ 31 марта 2020

У меня проблема с цветовой шкалой моего kdeplot. Он должен показывать процент в каждой корзине, начиная с 0%. Я пробовал два разных способа, но обе визуализации не совсем то, что мне нужно.

kdeplot with JointGrid

kdeplot with jointplot

Версия с JointGrid действительно начинается с 0%, но не показывает другие значения для каждого цвета. Кроме того, мне нужно, чтобы «фон» был белым или хотя бы ярким (не черным, а затененным).

Версия с JointPlot отображает значения для каждого цвета, но не в процентах.

Вот код, который я использовал для создания визуализаций:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns


x = np.random.normal(np.tile(np.random.uniform(-5, 35, 10), 1000), 4)
y = np.random.normal(np.tile(np.random.uniform(910, 1030, 10), 1000), 4)
data = pd.DataFrame(x,y)

1

g = sns.JointGrid(x, y, data=data, space=0, xlim=[10,40], ylim=[920,1020])
g = g.plot_joint(sns.kdeplot, cmap="Blues_d", shade=True, cbar=True, cbar_kws= 
{'format':'%.0f%%','ticks': [0, 100]})
g = g.plot_marginals(sns.kdeplot, shade=True)

plt.subplots_adjust(left=0.1, right=0.8, top=0.9, bottom=0.1)
pos_joint_ax = g.ax_joint.get_position()
pos_marg_x_ax = g.ax_marg_x.get_position()
g.ax_joint.set_position([pos_joint_ax.x0, pos_joint_ax.y0, pos_marg_x_ax.width, pos_joint_ax.height])
g.fig.axes[-1].set_position([.83, pos_joint_ax.y0, .07, pos_joint_ax.height])

plt.show()

2

kdeplot = sns.jointplot(x, y, kind="kde", cbar=True, xlim=[10,40], ylim=[920,1020])

plt.subplots_adjust(left=0.1, right=0.8, top=0.9, bottom=0.1)
pos_joint_ax = kdeplot.ax_joint.get_position()
pos_marg_x_ax = kdeplot.ax_marg_x.get_position()
kdeplot.ax_joint.set_position([pos_joint_ax.x0, pos_joint_ax.y0, pos_marg_x_ax.width, 
pos_joint_ax.height])
kdeplot.fig.axes[-1].set_position([.83, pos_joint_ax.y0, .07, pos_joint_ax.height])

plt.show()

Может кто-нибудь помочь мне здесь, пожалуйста? Я действительно потерян.

1 Ответ

0 голосов
/ 01 апреля 2020

Чтобы получить цвета в обратном порядке (светлые для небольших значений, темные для высоких значений), измените cmap="Blues_d" на cmap="Blues". (Обратите внимание, что sns.kdeplot также имеет опцию shade_lowest=, которая может быть установлена ​​в False.)

Кажется, что отметки цветовой полосы зафиксированы на границах между каждым значением. Я не мог найти способ заменить галочки, но можно поменять их метки. Путем деления значения тика на его максимум и умножения на 100% можно получить процент. Однако они не подходят для значений от 0 до 100.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

x = np.random.normal(np.tile(np.random.uniform(15, 35, 10), 1000), 4)
y = np.random.normal(np.tile(np.random.uniform(940, 1000, 10), 1000), 10)

kdeplot = sns.jointplot(x, y, kind="kde", cbar=True, xlim=[10, 40], ylim=[920, 1020])

plt.subplots_adjust(left=0.1, right=0.8, top=0.9, bottom=0.1)
pos_joint_ax = kdeplot.ax_joint.get_position()
pos_marg_x_ax = kdeplot.ax_marg_x.get_position()
kdeplot.ax_joint.set_position([pos_joint_ax.x0, pos_joint_ax.y0, pos_marg_x_ax.width,
                               pos_joint_ax.height])
kdeplot.fig.axes[-1].set_position([.83, pos_joint_ax.y0, .07, pos_joint_ax.height])

# get the current colorbar ticks
cbar_ticks = kdeplot.fig.axes[-1].get_yticks()
# get the maximum value of the colorbar
_, cbar_max = kdeplot.fig.axes[-1].get_ylim()
# change the labels (not the ticks themselves) to a percentage
kdeplot.fig.axes[-1].set_yticklabels([f'{t / cbar_max * 100:.1f} %' for t in cbar_ticks])

plt.show()

sample plot

...