создание тепловой карты морского побережья из графика DataFrame, чтобы быть в курсе диапазонов данных - PullRequest
0 голосов
/ 21 марта 2019

Как можно составить тепловую карту морского побережья (созданную из графика DataFrame от pandas), чтобы быть в курсе диапазонов данных? То есть когда я наводю указатель мыши на график, я вижу в правом нижнем углу окна графика "x = y =" , а хочу видеть координаты точки на графике, который я нахожу over (например, "x = 25,6, y = 3,3" ), при условии, конечно, что входной DataFrame содержит 2D-гистограмму с равными ячейками размера по каждой оси.

В качестве альтернативы, может быть, я мог бы создать такой сюжет другим способом, чтобы добиться того же эффекта? Например, с ax.hist2d я получаю его из коробки, но я хочу иметь возможность вычислять с пользовательским содержимым кода каждого бина и эффективно создавать график тепловой карты (с цветовым кодированием содержимого бина).

import numpy as np 
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
Index = [ 1.0,  2.0,  3.0,  4.0,  5.0]
Cols  = [10.0, 20.0, 30.0, 40.0, 50.0]
df = pd.DataFrame(abs(np.random.randn(5, 5)), 
    index=Index, columns=Cols)
plt.close(1)
fig,ax = plt.subplots(num=1)
sns.heatmap(df, annot=True)
plt.show(block=False)

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Если вы замените sns.heatmap(...) на ax.imshow(..), вы приблизитесь к тому, что вам нужно.Затем вы можете установить экстент изображения на нужный вам диапазон данных.

import numpy as np; np.random.seed(42)
import pandas as pd
import matplotlib.pyplot as plt

Index = [ 1.0,  2.0,  3.0,  4.0,  5.0]
Cols  = [10.0, 20.0, 30.0, 40.0, 50.0]
df = pd.DataFrame(abs(np.random.randn(5, 5)), 
    index=Index, columns=Cols)
plt.close(1)
fig,ax = plt.subplots(num=1)
dx = np.diff(df.columns)[0]/2
dy = np.diff(df.index)[0]/2
extent = [df.columns.min()-dx, df.columns.max()+dx,
          df.index.min()-dy, df.index.max()+dy] 
ax.imshow(df, extent=extent, aspect="auto")

plt.show()

enter image description here

0 голосов
/ 12 апреля 2019
from matplotlib.ticker import FixedFormatter


class CustomFormatter(FixedFormatter):
    def __init__(self, old):
        super().__init__(old.seq)

    def __call__(self, x, pos=None):
        return self.seq[abs(self.locs - x).argmin()]

plt.gca().xaxis.set_major_formatter(CustomFormatter(plt.gca().xaxis.get_major_formatter()))
plt.gca().yaxis.set_major_formatter(CustomFormatter(plt.gca().yaxis.get_major_formatter()))
...