Не получить тепловую карту в фоновом режиме с помощью Matplotlib Python - PullRequest
0 голосов
/ 22 февраля 2019

Я попробовал это и получил результат как на изображении:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
cmap = LinearSegmentedColormap.from_list("", ["red","grey","green"])
df = pd.read_csv('t.csv', header=0)

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax = ax1.twiny()
# Scatter plot of positive points, coloured blue (C0)
ax.scatter(np.argwhere(df['real'] > 0), df.loc[df['real'] > 0, 'real'], color='C2')
# Scatter plot of negative points, coloured red (C3)
ax.scatter(np.argwhere(df['real'] < 0), df.loc[df['real'] < 0, 'real'], color='C3')
# Scatter neutral values in grey (C7)
ax.scatter(np.argwhere(df['real'] == 0), df.loc[df['real'] == 0, 'real'], color='C7')

ax.set_ylim([df['real'].min(), df['real'].max()])
index = len(df.index)
ymin = df['prediction'].min()
ymax= df['prediction'].max()
ax1.imshow([np.arange(index),df['prediction']],cmap=cmap,
                        extent=(0,index-1,ymin, ymax), alpha=0.8)
plt.show()

Изображение:
output

Я ожидал один выводгде цвет размещен в соответствии с рисунком.Я получаю зеленый цвет, и нет красного или серого.

Я хочу получить изображение или контуры в виде значений.Как я могу это сделать?Смотрите следующее изображение, что-то похожее:
expected output

Пожалуйста, дайте мне знать, как мне этого добиться.Данные, которые я использовал здесь: t.csv
Для живой версии взгляните на Tensorflow Playground

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Для решения, подобного следующему, необходимо 2 задачи:

  • Построить тепловую карту в качестве фона;
  • Построить данные рассеяния;

Вывод :

image

Исходный код :

import numpy as np
import matplotlib.pyplot as plt

###
# Plot heatmap in the background
###

# Setting up input values
x = np.arange(-6.0, 6.0, 0.1)
y = np.arange(-6.0, 6.0, 0.1)
X, Y = np.meshgrid(x, y)

# plot heatmap colorspace in the background
fig, ax = plt.subplots(nrows=1)
im = ax.imshow(X, cmap=plt.cm.get_cmap('RdBu'), extent=(-6, 6, -6, 6), interpolation='bilinear')
cax = fig.add_axes([0.21, 0.95, 0.6, 0.03]) # [left, bottom, width, height]
fig.colorbar(im, cax=cax, orientation='horizontal')  # add colorbar at the top

###
# Plot data as scatter
###
# generate the points
num_samples = 150
theta = np.linspace(0, 2 * np.pi, num_samples)

# generate inner points
circle_r = 2
r = circle_r * np.random.rand(num_samples)
inner_x, inner_y = r * np.cos(theta), r * np.sin(theta)

# generate outter points
circle_r = 4
r = circle_r + np.random.rand(num_samples)
outter_x, outter_y = r * np.cos(theta), r * np.sin(theta)

# plot data
ax.scatter(inner_x, inner_y, s=30, marker='o', color='royalblue', edgecolors='white', linewidths=0.8)
ax.scatter(outter_x, outter_y, s=30, marker='o', color='crimson', edgecolors='white', linewidths=0.8)
ax.set_ylim([-6,6])
ax.set_xlim([-6,6])

plt.show()

Для простоты я сохранилдиапазон цветовой шкалы (-6, 6) для соответствия диапазону данных.

Я уверен, что этот код можно изменить в соответствии с вашими потребностями.Удачи!

0 голосов
/ 27 февраля 2019

Вот возможное решение.

Несколько замечаний и вопросов:

  • Каковы значения «прогноза» в вашем файле данных?Похоже, они не коррелируют со значениями в «реальном» столбце.
  • Почему вы создаете вторую ось?Что изображено на нижней оси X на вашем графике?Я удалил вторую ось и обозначил оставшиеся оси (индексные и реальные).
  • Когда вы разрезаете пандус DataFrame, индекс идет вместе с ним.Вам не нужно создавать отдельный индекс (argwhere и arange (index) в вашем коде).Я упростил первую часть кода, где создаются диаграммы рассеяния.
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap
cmap = LinearSegmentedColormap.from_list("", ["red","grey","green"])
df = pd.read_csv('t.csv', header=0)
print(df)

fig = plt.figure()
ax = fig.add_subplot(111)

# Data limits
xmin = 0
xmax = df.shape[0]
ymin = df['real'].min()
ymax = df['real'].max()

# Scatter plots
gt0 = df.loc[df['real'] > 0, 'real']
lt0 = df.loc[df['real'] < 0, 'real']
eq0 = df.loc[df['real'] == 0, 'real']
ax.scatter(gt0.index, gt0.values, edgecolor='white', color='C2')
ax.scatter(lt0.index, lt0.values, edgecolor='white', color='C3')
ax.scatter(eq0.index, eq0.values, edgecolor='white', color='C7')
ax.set_ylim((ymin, ymax))
ax.set_xlabel('index')
ax.set_ylabel('real')

# We want 0 to be in the middle of the colourbar, 
# because gray is defined as df['real'] == 0
if abs(ymax) > abs(ymin):
    lim = abs(ymax)
else:
    lim = abs(ymin)

# Create a gradient that runs from -lim to lim in N number of steps,
# where N is the number of colour steps in the cmap.
grad = np.arange(-lim, lim, 2*lim/cmap.N)

# Arrays plotted with imshow must be 2D arrays. In this case it will be
# 1 pixel wide and N pixels tall. Set the aspect ratio to auto so that
# each pixel is stretched out to the full width of the frame.
grad = np.expand_dims(grad, axis=1)
im = ax.imshow(grad, cmap=cmap, aspect='auto', alpha=1, origin='bottom',
               extent=(xmin, xmax, -lim, lim))
fig.colorbar(im, label='real')
plt.show()

Это дает следующий результат: scatterplot with gradient in background

...