2D гистограмма с несколькими цветовыми полосами

#python #numpy #histogram #heatmap #contour

#python #numpy #гистограмма #тепловая карта #контур

Вопрос:

У меня есть 3 набора данных, которые я хотел бы показать в одной плоскости 2D. Поскольку при использовании kdeplot от seaborn становится немного тесно, я хотел бы использовать какую-то тепловую карту. Возможно ли иметь одну 2D гистограмму или тепловую карту в python с 3 разными цветовыми полосами (по одной для каждого набора данных) или с одной составной цветовой полосой? Вот пример контуров.

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

x1, x2, x3 = np.random.normal(0.2, 0.1, 100), np.random.normal(0.7, 0.1, 100), np.random.normal(0.5, 0.1, 100)
y1, y2, y3 = np.random.normal(0.2, 0.1, 100), np.random.normal(0.2, 0.1, 100), np.random.normal(0.5, 0.1, 100)
plt.figure()
sns.kdeplot(x1, y1, color="blue")
sns.kdeplot(x2, y2, color='green')
sns.kdeplot(x3, y3, color="red")

plt.show()
 

Пример контуров

Я вижу это белой или черной плоскостью с красными, зелеными и синими точками доступа для разных наборов данных, но я не знаю, как вы перекрываете эти виды тепловых карт, например, plt.hist2d() или plt.hexbin() или plt.imshow() . Я уже определил пользовательскую цветовую карту, которая, по моему мнению, может быть полезной, но я не уверен, как назначить разные наборы данных основным цветам карты…

 cmap2 = ["white", "blue", "green", "red"]
cmap2_arr = np.array([list(mpl.colors.to_rgba(c)) for c in cmap2])  # This converts the names to rgba tuples
map_object = mpl.colors.LinearSegmentedColormap.from_list(name='mymap', colors=cmap2_arr)
plt.register_cmap(cmap=map_object)
 

Ответ №1:

Вы можете попытаться построить 2D-контурный график ваших данных в 3D следующим образом.

 from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches

fig    = plt.figure()
ax     = fig.add_subplot(projection='3d')

x      = np.linspace(0, 1, 100)
X, Y   = np.meshgrid(x, x)
levels = np.linspace(-0.1, 0.4, 100)  #(z_min,z_max,number of contour),

x1, x2, x3 = np.random.normal(0.2, 0.1, 100), np.random.normal(0.7, 0.1, 100), np.random.normal(0.5, 0.1, 100)

y1, y2, y3 = np.random.normal(0.2, 0.1, 100), np.random.normal(0.7, 0.1, 100), np.random.normal(0.5, 0.1, 100)

a=0
b=1
c=2

def f(a, b):
   return np.sin(a*X)*np.sin(b*Y)

Z1 = a   f(2, 4)
Z2 = b   f(3, 4)
Z3 = c   f(4, 5)

# following is for changing default cmap
# value in plt.contourf
# cmap = plt.get_cmap('inferno')

plt.contourf(x1, y1, Z1, levels=a levels)
plt.contourf(x2, y2, Z2, levels=b levels)
plt.contourf(x3, y3, Z3, levels=c levels)

plt.colorbar()
plt.show()
 

2D Контурный график

Некоторые полезные ссылки