2016-02-22 2 views
1

Мне нужно создать диаграмму с сеткой, как на следующем рисунке. Grid for chart Ключевых факторов являются:Возможно ли создать диаграмму с этим конкретным фоном?

  1. По оси й время с каждым тиком маркировкой 30 секунд
  2. у-оси этикетки на графику повторе при переменном интервале
  3. диаграммы должен расти с количеством данных (т. е. за 30 минут данных, должно быть 60 коробок в ширину)

Я немного искал matplotlib, и это кажется многообещающим. Мне также удалось заполнить диаграмму данными. См. Мой результат за 40 минут данных. My progress so far

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

Вот источник на изображении выше (my_data фактически считывается из CSV, но заполняется случайным мусором здесь):

from matplotlib import dates 
import matplotlib.pyplot as plt 
import numpy as np 
import time 
from datetime import datetime 

my_data = list() 
for i in range(3000): 
    my_data.append((datetime.fromtimestamp(i + time.time()), np.random.randint(50, 200), np.random.randint(10, 100))) 

hfmt = dates.DateFormatter('%H:%M:%S') 
fig = plt.figure() 

actg = fig.add_subplot(2, 1, 1) # two rows, one column, first plot 
plt.ylim(50, 210) 

atoco = fig.add_subplot(2, 1, 2) # second plot 
plt.ylim(0, 100) 

actg.xaxis.set_minor_locator(dates.MinuteLocator()) 
actg.xaxis.set_major_formatter(hfmt) 

atoco.xaxis.set_minor_locator(dates.MinuteLocator()) 
atoco.xaxis.set_major_formatter(hfmt) 
plt.xticks(rotation=45) 
times = [] 
fhr1 = [] 
toco = [] 
for key in my_data: 
    times.append(key[0]) 
    fhr1.append(key[1]) 
    toco.append(key[2]) 
actg.plot_date(times, fhr1, '-') 
atoco.plot_date(times, toco, '-') 

for ax in fig.axes: 
    ax.grid(True) 
plt.tight_layout() 
plt.show() 
+0

Можете ли вы поделиться своим кодом как [MCVE] (// stackoverflow.com/help/mcve), пожалуйста? – tom

+0

@tom: Просто сделал это, спасибо за ваше терпение. – Sherlock70

ответ

1

ОК, вот что-то близко к тому, что вы после этого, я думаю.

Я использовал dates.SecondLocator(bysecond=[0,30]), чтобы установить сетку через каждые 30 секунд (также необходимо убедиться, что сетка устанавливается на малых клещами, с ax.xaxis.grid(True,which='both')

Чтобы повторить yticklabels, я создаю twinx осей для каждый крупный тик на xaxis и переместите spine в местоположение этого тика. Затем я установил цвет позвоночника, чтобы он не отображался и не показывался, и не изменялся фактический тик, но не тик-метки.

from matplotlib import dates 
import matplotlib.pyplot as plt 
import numpy as np 
import time 
from datetime import datetime 

# how often to show xticklabels and repeat yticklabels: 
xtickinterval = 10 

# Make random data 
my_data = list() 
for i in range(3000): 
    my_data.append((datetime.fromtimestamp(i + time.time()), np.random.randint(120, 160), np.random.randint(10, 100))) 

hfmt = dates.DateFormatter('%H:%M:%S') 
fig = plt.figure() 

actg = fig.add_subplot(2, 1, 1) # two rows, one column, first plot 
actg.set_ylim(50, 210) 

atoco = fig.add_subplot(2, 1, 2,sharex=actg) # second plot, share the xaxis with actg 
atoco.set_ylim(-5, 105) 

# Set the major ticks to the intervals specified above. 
actg.xaxis.set_major_locator(dates.MinuteLocator(byminute=np.arange(0,60,xtickinterval))) 
# Set the minor ticks to every 30 seconds 
minloc = dates.SecondLocator(bysecond=[0,30]) 
minloc.MAXTICKS = 3000 
actg.xaxis.set_minor_locator(minloc) 
# Use the formatter specified above 
actg.xaxis.set_major_formatter(hfmt) 

times = [] 
fhr1 = [] 
toco = [] 

for key in my_data: 
    times.append(key[0]) 
    fhr1.append(key[1]) 
    toco.append(key[2]) 

print times[-1]-times[0] 

# Make your plot 
actg.plot_date(times, fhr1, '-') 
atoco.plot_date(times, toco, '-') 

for ax in [actg,atoco]: 
    # Turn off the yticklabels on the right hand side 
    ax.set_yticklabels([]) 

    # Set the grids 
    ax.xaxis.grid(True,which='both',color='r') 
    ax.yaxis.grid(True,which='major',color='r') 

    # Create new yticklabels every major tick on the xaxis 
    for tick in ax.get_xticks(): 
     tx = ax.twinx() 
     tx.set_ylim(ax.get_ylim()) 
     tx.spines['right'].set_position(('data',tick)) 
     tx.spines['right'].set_color('None') 
     for tic in tx.yaxis.get_major_ticks(): 
      tic.tick1On = tic.tick2On = False 


plt.tight_layout() 
plt.show() 

enter image description here

+0

Ничего себе, это выглядит очень хорошо! Так близко к тому, что мне нужно, я сдулся. : D Теперь я действительно буду копать в matplotlib, мне придется покрасить сетку (зеленый или красный, выбор пользователей) и другие вещи. Но это было основным препятствием, которое я видел. Спасибо тонны! – Sherlock70

+0

Ах, извините. Быстрое наблюдение за этим. С 300 секундами данных это прекрасно работает. Но я обычно встречал больше ... как минимум в десять раз больше. С чуть более 3000 секунд я получаю следующую ошибку времени выполнения: RRuleLocator, по оценкам, генерирует 3049 тиков с 2016-02-23 15: 21: 41.581725 + 00: 00 до 2016-02-23 16: 12: 31.099945 + 00: 00: превышает Locator.MAXTICKS * 2 (2000) --- Любые мысли или советы по этому поводу? – Sherlock70

+1

вы можете установить параметр «МАКСИМАЛЬНО» параметра локатора микса. Это 1000 по умолчанию. Я нашел, установив его на 1500, что, кажется, работает на 3000 секунд. В моем отредактированном примере выше я установил его на 3000, чтобы дать вам комнату для маневра. (Я также изменил сетку на красный) – tom

Смежные вопросы