#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()
Некоторые полезные ссылки