Внедрение графиков горизонта в matplotlib

Я пытаюсь реализовать диаграммы горизонта в matplotlib (см .: http://square.github.com/cubism/ )

Основная идея состоит в том, что вы показываете временные ряды в узком соотношении сторон, а по мере увеличения значений (за пределом оси y) они начинают восстанавливаться снизу в более темном цвете (подумайте о старых играх Atari, когда вы пойдете мимо верхней части экрана и выскочите в нижней части экрана).

Мой основной подход состоит в том, чтобы разделить y-данные на патроны и построить каждую вертикальную группу по новым осям с использованием ax.twinx() и соответствующим образом установить пределы.

Только для положительных или отрицательных данных это работает хорошо.

Положительный:

позитивная диаграмма горизонта

Отрицательный:

отрицательная гистограмма

Но по какой-то причине оба винта поднимаются вверх:

 # setup the environment import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, np.pi*4, 137) y = (2*np.random.normal(size=137) + x**2) # reflect everything around the origin xx = np.hstack([-1*x[::-1], x]) yy = np.hstack([-1*y[::-1], y]) # function to do the plot def horizonPlot(ax, x, y, nfolds=3, inverty=False, color='CornflowerBlue'): axes = [ax] if inverty: ylims = np.linspace(y.min(), y.max(), nfolds + 1)[::-1] else: ylims = np.linspace(y.min(), y.max(), nfolds + 1) for n in range(1, nfolds): newax = axes[-1].twinx() axes.append(newax) for n, ax in enumerate(axes): ax.fill_between(x, y, y2=ylims[n], facecolor=color, alpha=1.0/nfolds, zorder=n) ax.set_ylim([ylims[n], ylims[n+1]]) ax.set_yticklabels([]) ax.set_yticks([]) if inverty: ax.invert_yaxis() ax.set_xlim([x.min(), x.max()]) return fig fig, baseax = plt.subplots(figsize=(6.5,1.5)) posax = baseax.twinx() negax = posax.twinx() fig = horizonPlot(posax, xx, np.ma.masked_less(yy, 0), inverty=False, color='DarkGreen') fig = horizonPlot(negax, xx, np.ma.masked_greater(yy, 0), inverty=True, color='CornflowerBlue') for ax in fig.get_axes(): ax.set_yticklabels([]) fig.tight_layout() plt.show() 

Плохая диаграмма (обратите внимание на отсутствие нескольких слоев на положительной стороне):

обе диаграммы горизонта

Любые мысли были бы очень оценены!

One Solution collect form web for “Внедрение графиков горизонта в matplotlib”

Я действительно не знаю, почему ваш не работает, потому что на моем компьютере все работает нормально. Но так как я действительно заинтересован в этом заговоре, я попытался реализовать его самостоятельно, без всякой этой причудливой вещи с twinx .

Я просто рисую эти области на вершине eachother, так как это на самом деле отличная вещь в сюжете. Таким образом, мне не нужно настраивать альфа, они просто складываются.

 import numpy as np from matplotlib.pyplot import * def layer(y,height): neg=0.0;pos=0.0 if y>0: if y-height>=0: pos=height y-= pos else : pos = y elif y<0: if y+height<=0: neg=height y += neg else : neg = -y return pos,neg def horizonPlot(x,y,height=50.0,colors=['CornflowerBlue','DarkGreen']): alpha = .10 vlayer = np.vectorize(layer) while (y != 0).any(): l = vlayer(y,height) y -= l[0];y += l[1] fill_between(x,0,l[0],color=colors[0], alpha=alpha) fill_between(x,height-l[1],height,color=colors[1], alpha=alpha) def main(): x = np.linspace(0, np.pi*4, 137) y = (2*np.random.normal(size=137) + x**2) xx = np.hstack([-1*x[::-1], x]) yy = np.hstack([-1*y[::-1], y]) horizonPlot(xx,yy) show() 

На моей машине это выглядит следующим образом. Надеюсь, он работает на вас, но я просто использую базовые методы построения.

введите описание изображения здесь

  • Визуализация статистики данных Mongodb с использованием matplotlib
  • custom matplotlib plot: шахматная доска, как таблица с цветными ячейками
  • создание графиков разметки matplotlib из dataframes в пандах Python
  • Matplotlib: установить ось жесткой только на ось x или y
  • Набрав греческие буквы и т. Д. На графиках Python
  • Цвета графического изображения Matplotlib появляются темнее обычного
  • Как авторизовать текст в matplotlib python?
  • Как разделить цвет люка и края в matplotlib?
  • Python - лучший язык программирования в мире.