2013-09-24 3 views
0

У меня есть массив двумерного массива, содержащий значения, которые я хотел бы построить по оси Y, и массив двумерного массива значений datetime, которые я хотел бы построить по оси X, и я бы хотел чтобы получить две строки значений по дате из этих массивов. Но эти структуры, используемые as-is, работают не так, как ожидалось, поскольку у меня есть другой вид графика, чем линейный граф.значения сюжета из массивов bidemensionnal

значение для оси х (даты):

[[datetime.datetime(2011, 1, 1, 0, 0, 25, 135000), datetime.datetime(2011, 2, 1, 0, 0, 57, 386000), 
datetime.datetime(2011, 3, 1, 0, 0, 59, 579000), datetime.datetime(2011, 4, 1, 0, 0, 27, 676000), 
datetime.datetime(2011, 5, 1, 0, 0, 25, 135000), datetime.datetime(2011, 6, 1, 0, 0, 26, 414000), 
datetime.datetime(2011, 7, 1, 0, 0, 28, 145000), datetime.datetime(2011, 8, 1, 0, 0, 26, 432000), 
datetime.datetime(2011, 9, 1, 0, 0, 27, 301000), datetime.datetime(2011, 10, 1, 0, 0, 27, 643000), 
datetime.datetime(2011, 11, 1, 0, 0, 27, 673000), datetime.datetime(2011, 12, 1, 0, 0, 28, 294000)], 
[datetime.datetime(2011, 1, 1, 0, 0, 25, 135000), datetime.datetime(2011, 2, 1, 0, 0, 57, 386000), 
datetime.datetime(2011, 3, 1, 0, 0, 59, 579000), datetime.datetime(2011, 4, 1, 0, 0, 27, 676000), 
datetime.datetime(2011, 5, 1, 0, 0, 25, 135000), datetime.datetime(2011, 6, 1, 0, 0, 26, 414000), 
datetime.datetime(2011, 7, 1, 0, 0, 28, 145000), datetime.datetime(2011, 8, 1, 0, 0, 26, 432000), 
datetime.datetime(2011, 9, 1, 0, 0, 27, 301000), datetime.datetime(2011, 10, 1, 0, 0, 27, 643000), 
datetime.datetime(2011, 11, 1, 0, 0, 27, 673000), datetime.datetime(2011, 12, 1, 0, 0, 28, 294000)]] 

значение для оси у (мин, макс):

[[-8.0, 19.0, 11.0, 6.0, 6.0, 6.0, 6.0, 6.0, 2.0, 2.0, 2.0, 2.0], 
[-12.0, -7.0, -6.0, -6.0, -6.0, -6.0, -6.0, -6.0, -6.0, -6.0, -7.0, -7.0]] 

Я хотел бы некоторую помощь о том, как превратить эти структуры так отображаются две строки мин и максимальная дата.

ответ

1

Если у вас есть два «двумерный» массивы, называемые x и y, которые имеют одинаковую длину, то попробуйте

import numpy as np 
import matplotlib.pyplot as plt 

# populate x and y arrays. 

x = np.array(x) 
y = np.array(y) 

fig = plt.figure() 
ax = fig.add_subplot(111) 

ax.plot(x[:,0], y[:,0], 'g-o') 
ax.plot(x[:,1], y[:,1], 'r-x') 

В общем, если ваши массивы имеют только 1 размер, вы можете просто сделать

ax.plot(x, y) 

Если массивы имеют более двух наборов значений, вы могли бы сделать

for i in range(x.shape[-1]): 
    ax.plot(x[:,i], y[:,0]) 

Обозначение x[:,n] имеет две части; : означает получение данных из каждой строки, а ,n означает, что элемент n+1 (0 представляет первый) из каждой строки. Это работает, потому что ваши данные структурированы как

[[date00, date01], 
[date10, date11], 
[date20, date21], 
... 
[dateN0, dateN1]] 

так x[:,0] занимает первый столбец и x[:,1] занимает вторую колонку.

Если у вас был большой массив из многих измерений, вы можете индексировать каждый массив, как x[dim0, dim1, ..., dimN]. Например, предположим, что у вас есть 3-мерный массив медицинских данных, в которых размеры представлены идентификатором patientID, sampleID, viral_load, вы могли бы захватить последний номер вирусной нагрузки из всех образцов от первого пациента, выполнив data[0, :, -1] или все номера вирусной нагрузки из всех образцы от этого пациента, выполнив data[0, :, :].

+0

Хорошо, спасибо. Есть ли более общий способ сделать это так, чтобы он работал для массива с размером, превосходящим 2 или даже размером 1? Я попытался в цикле, но он просто построил прямую вертикальную линию на графике. – jerome

+0

Проверьте изменения. Я попытался ответить на ваши вопросы. – wflynny

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