Матплотлиб | Изменение представления графика при применении логарифмической шкалы c - PullRequest
0 голосов
/ 20 марта 2020

Учитывая набор точек, которые должны быть представлены на трехмерном графике (в виде точечной диаграммы), я подумал, что было бы интересно отобразить те же данные в 2D, а не в 3D благодаря hist2d и использованию weights.

Эти данные имеют низкие и высокие значения (с разницей в несколько порядков), поэтому при представлении в виде графика hist2d некоторые данные «теряются» (в основном, нижние точки).

Для того чтобы получить Для лучшего представления всех значений я представляю один и тот же график в логарифмическом масштабе c. В результате я заметил две разные вещи. Во-первых, все точки, кроме тех, которые включены в представляемые данные, отображаются в виде белых пикселей (похоже, что в логарифмическом масштабе c все эти точки игнорируются), а не окрашиваются как самые низкие точки (см. Также самую низкую часть цветового диапазона). , это белый, а не синий). Во-вторых, и это не так важно, значения шкалы в цветовой полосе представлены в виде степеней 10.

Так что мой вопрос касается этих двух моментов, как все эти «белые» области могут быть представлены синим цветом, что в цвете самых низких точек и как можно настроить цветовую полосу, чтобы не показывать степени 10 и вместо этого представлять числа как нормальные (1, 10, 100 ...)?

import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np


# Data
x = [8 for i in range(65)]
y = [75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11]
z = [895, 800, 710, 635, 565, 500, 440, 392, 347, 304, 268, 235, 205, 179, 156, 135, 117, 101, 89, 76, 64, 55, 47, 40, 34, 29, 25, 20, 16, 14, 12, 9, 7, 6, 5, 4, 3, 2.5, 2, 1.7, 1.3, 1, 0.775, 0.60, 0.45, 0.35, 0.25, 0.18, 0.14, 0.10, 0.07, 0.05, 0.035, 0.025, 0.020, 0.015, 0.010, 0.007, 0.006, 0.005, 0.005, 0.005, 0.005, 0.005, 0.005]

fig = plt.figure()

# First plot
fig.add_subplot(211)

plt.hist2d(x, y, weights=z, bins=len(x), cmap='plasma')
cb = plt.colorbar(extend='both')
cb.set_label('height')

# Second plot. Using log scale
fig.add_subplot(212)

plt.hist2d(x, y, weights=z, bins=len(x), norm=mpl.colors.LogNorm(vmin=min(z), vmax=max(z)), cmap='plasma')
cb = plt.colorbar(extend='both')
cb.set_label('height')

plt.show()

1 Ответ

3 голосов
/ 20 марта 2020

(я предполагаю, что все значения x равны 8, чтобы создать минимальный пример.)

Белый "цвет" - это потому, что лог ноля равен NaN или минус бесконечность, поэтому цвет отсутствует ( показывая фон). Чтобы изменить цвет фона на значение 0 цветовой карты «плазма»:

plt.gca().set_facecolor(plt.get_cmap('plasma')(0))

Чтобы избежать обозначения scientifi c и иметь только галочки больше 1, вы можете изменить тики и формат тиков цветовой полосы.

Поскольку минимум z равен нулю, вы теряете много цветового пространства между 0 и 1. Установка vmin в 1 (или в 0,99) позволяет избежать что.

from matplotlib import ticker

fig.add_subplot(212)
plt.gca().set_facecolor(plt.get_cmap('plasma')(0))
plt.hist2d(x, y, weights=z, bins=len(x), norm=mpl.colors.LogNorm(vmin=1, vmax=max(z)), cmap='plasma')
cb = plt.colorbar(extend='both')
cb.set_label('height')
cb.set_ticks([1, 10, 100] + list(range(500, max(z), 500))) 
cb.ax.yaxis.set_major_formatter(ticker.ScalarFormatter()) # remove the scientific notation
cb.ax.yaxis.set_minor_locator(ticker.NullLocator()) # optionally remove the minor ticks

resulting plot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...