Matplotlib / Seaborn, фигура слишком подробная, поэтому важные детали исчезают - PullRequest
0 голосов
/ 25 сентября 2018

Я застрял с проблемой, связанной с рендерингом matplotlib или моим собственным графическим процессором.Ниже приведен код, который принимает Pandas DataFrame и выводит тепловую карту NaN в этом кадре данных для каждого столбца.Темная линия - это NaN, более светлая линия - это не NaN.Входные кадры данных могут иметь длину от 500 тыс. До 1 млн. Строк.Это означает, что не каждый NaN (особенно если он только 1 или 2) виден на графике.

def plot_nans(df, dwelling_id):
    """
    Create a heatmap of the NaNs in the input DataFrame.
    :param df: Pandas DataFrame
    :param dwelling_id: String
    :return: Seaborn heatmap as a Figure
    """
    plt.clf()
    df = df.isnull()
    #df = df.resample('12H').sum()

    # Downsample to make all data visible?

    # Reindex datetimes
    # https://stackoverflow.com/questions/41046630/set-time-formatting-on-a-datetime-index-when-plotting-pandas-series
    try:
        df.index = df.index.to_period('D')
    except:
        print('plot_nans could not set df.index.to_period')

    # Plot heatmap
    n = int(len(df)*0.1)  # Choose amount of yticklabels to show

    try:
        fig = sns.heatmap(df, cmap='Reds', square=False, vmin=0, cbar=False, yticklabels=n*2, cbar_kws={})
    except TypeError:
        print('plot_nans ValueError')
        fig = sns.heatmap(df, cmap='Reds', square=False, vmin=0, cbar=False, cbar_kws={})

    # Set cbar ticks manually
    #cbar = fig.collections[0].colorbar
    #cbar.set_ticks([0, 1])
    #cbar.set_ticklabels(['Not NaN', 'NaN'])

    # Correct layout
    fig.invert_yaxis()
    fig.tick_params(axis='x', rotation=90)
    fig.tick_params(axis='y', rotation=0)
    fig.set(xlabel='Column [-]', ylabel='Index [-]')
    plt.title('Dwelling ID: '+dwelling_id)

    fig = fig.get_figure()
    fig.tight_layout()
    fig.show()
    print('Saving heatmap')
    fig.savefig('//datc//opschaler//nan_information//figures//' + dwelling_id + '.png', dpi=1200)

    return fig

Исходный график выхода можно увидеть ниже.

Original image

Однако проблема в том, что меньший темный цветлинии часто не отображаются на сюжете.Например, при загрузке файла вы можете увидеть следующее:

Сначала он выглядит так (заметьте, что «много» маленьких темных линий): enter image description here

Затем через секунду после загрузки строки исчезают.

enter image description here

Как можно решить эту проблему?Желательно без необходимости понижать данные.

...