Постройте гистограмму, используя Python с разными цветами для положительных и отрицательных значений. - PullRequest
1 голос
/ 21 ноября 2019

Я сделал следующий график с использованием Python:

import matplotlib.pyplot as plt
plt.hist([x*100 for x in relativeError], bins = 100)
plt.xlabel("Relative Error [%]")
plt.ylabel("#samples")
plt.axvline(x=0, linestyle='--',linewidth=1, color='grey')

enter image description here

Но я действительно хочу иметь разные цвета в зависимости от того, является ли значениеположительный или отрицательный.

Ответы [ 3 ]

3 голосов
/ 21 ноября 2019

Вы можете просто раскрасить столбцы после факта.

import numpy as np
import matplotlib.pyplot as plt

x = np.random.normal(-20, 15, 5000)

_, _, bars = plt.hist(x, bins = 100, color="C0")
for bar in bars:
    if bar.get_x() > 0:
        bar.set_facecolor("C1")
plt.xlabel("Relative Error [%]")
plt.ylabel("#samples")
plt.axvline(x=0, linestyle='--',linewidth=1, color='grey')
plt.show()

enter image description here

Если вместо этого вы хотите построить гистограмму гистограммированных значений(как предлагает другой ответ), это будет выглядеть как

import numpy as np
import matplotlib.pyplot as plt

x = np.random.normal(-20, 15, 5000)

hist, edges = np.histogram(x, bins=100)

colors = np.array(["C0", "C1"])[(edges[:-1] > 0).astype(int)]
plt.bar(edges[:-1], hist, width=np.diff(edges), align="edge", color=colors)
plt.xlabel("Relative Error [%]")
plt.ylabel("#samples")
plt.axvline(x=0, linestyle='--',linewidth=1, color='grey')
plt.show()
0 голосов
/ 21 ноября 2019

Во-первых, вам нужно вычислить высоту и положение столбцов для гистограммы. Затем вам нужно создать маску для фильтрации положительных и отрицательных данных. Наконец, вы строите каждый поднабор столбцов отдельно и задаете цвет при каждом вызове функции plt.bar().

Пример с поддельными данными, которые выглядят как ваши:

import matplotlib.pyplot as plt
import numpy as np

# generate fake data
N = 1000
data = np.random.normal(loc=-1, size=N) # with average -1

n_bins = 100
heights, bins, _ = plt.hist(data, bins=n_bins) # get positions and heights of bars

bin_width = np.diff(bins)[0]
bin_pos = bins[:-1] + bin_width / 2

plt.figure()

mask = (bin_pos >= 0)

# plot data in two steps
plt.bar(bin_pos[mask], heights[mask], width=bin_width, color='C1')
plt.bar(bin_pos[~mask], heights[~mask], width=bin_width, color='C0')

plt.xlabel("Relative Error [%]")
plt.ylabel("#samples")
plt.axvline(x=0, linestyle='--',linewidth=1, color='grey')

plt.show()

enter image description here

0 голосов
/ 21 ноября 2019
# libraries
import numpy as np
import matplotlib.pyplot as plt

# Make a fake dataset
height = [3, 12, 5, 18, 45]
bars = ('A', 'B', 'C', 'D', 'E')
y_pos = np.arange(len(bars))

Теперь давайте рассмотрим 3 примера использования цвета:

Однородный цвет с использованием RGB RGB - это способ создания цветов. Вы должны указать количество красного, зеленого и синего + прозрачность, и он вернет цвет.

      plt.bar(y_pos, height, color=(0.2, 0.4, 0.6, 0.6))
      plt.xticks(y_pos, bars)
      plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...