как сгенерировать серию гистограмм на matplotlib? - PullRequest
0 голосов
/ 05 октября 2018

Я хотел бы создать серию гистограмм, показанных ниже:

enter image description here

Приведенная выше визуализация была выполнена в тензорном потоке, но я хотел бы воспроизвестита же визуализация на matplotlib.

РЕДАКТИРОВАТЬ: Используя plt.fill_between, предложенный @SpghttCd, у меня есть следующий код:

colors=cm.OrRd_r(np.linspace(.2, .6, 10))
plt.figure()
x = np.arange(100)
for i in range(10):
    y = np.random.rand(100)
    plt.fill_between(x, y + 10-i, 10-i, 
                     facecolor=colors[i]
                     edgecolor='w')
plt.show()

Это прекрасно работает, но можно вместо этого использовать гистограммунепрерывной кривой?

1 Ответ

0 голосов
/ 05 октября 2018

РЕДАКТИРОВАТЬ:
подход на основе джойпи, как упомянуто в комментарии октября:

import pandas as pd
import joypy
import numpy as np

df = pd.DataFrame()
for i in range(0, 400, 20):
    df[i] = np.random.normal(i/410*5, size=30)
joypy.joyplot(df, overlap=2, colormap=cm.OrRd_r, linecolor='w', linewidth=.5)

enter image description here

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

def color_gradient(x=0.0, start=(0, 0, 0), stop=(1, 1, 1)):
    r = np.interp(x, [0, 1], [start[0], stop[0]])
    g = np.interp(x, [0, 1], [start[1], stop[1]])
    b = np.interp(x, [0, 1], [start[2], stop[2]])
    return (r, g, b)

Использование:

joypy.joyplot(df, overlap=2, colormap=lambda x: color_gradient(x, start=(.78, .25, .09), stop=(1.0, .64, .44)), linecolor='w', linewidth=.5)

Примеры с различными значениями начала иостановить кортежи:

enter image description here


оригинальный ответ:

Вы можете перебирать свои массивы данных, которые вы 'Я хотел бы построить график с помощью plt.fill_between, установив цвета для некоторого градиента, а цвет линии - для белого:

, создав некоторые данные образца:

import numpy as np
t = np.linspace(-1.6, 1.6, 11)
y = np.cos(t)**2
y2 = lambda : y + np.random.random(len(y))/5-.1

подготовьте серию:

import matplotlib.pyplot as plt

import matplotlib.cm as cm
colors = cm.OrRd_r(np.linspace(.2, .6, 10))

plt.figure()
for i in range(10):
    plt.fill_between(t+i, y2()+10-i/10, 10-i/10, facecolor = colors[i], edgecolor='w')

enter image description here

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

РЕДАКТИРОВАТЬ:
Как я прокомментировал ниже, я не совсем уверен, понимаю ли я, что вы хотите - или вы хотите лучшее для васзадача.Поэтому вот код, который, помимо вашего подхода, в вашем редакторе представляет два примера того, как представить группу гистограмм таким образом, чтобы они были лучше сопоставимы:

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

N = 10
np.random.seed(42)

colors=cm.OrRd_r(np.linspace(.2, .6, N))

fig1 = plt.figure()
x = np.arange(100)
for i in range(10):
    y = np.random.rand(100)
    plt.fill_between(x, y + 10-i, 10-i, 
                     facecolor=colors[i],
                     edgecolor='w')

data = np.random.binomial(20, .3, (N, 100))

fig2, axs = plt.subplots(N, figsize=(10, 6))
for i, d in enumerate(data):
    axs[i].hist(d, range(20), color=colors[i], label=str(i))
fig2.legend(loc='upper center', ncol=5)


fig3, ax = plt.subplots(figsize=(10, 6))
ax.hist(data.T, range(20), color=colors, label=[str(i) for i in range(N)])
fig3.legend(loc='upper center', ncol=5)

Это приводит к следующим графикам:

  1. ваш график из ваших правок: enter image description here

  2. N гистограмм в N вспомогательных участках: enter image description here

  3. N гистограмм рядом на одном графике: enter image description here

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