2015-02-26 3 views
0

Я получил данные (2945 * 3) разных типов, импортированных в виде массива ячеек. Тип данных 1-го столбца был импортирован как текст (время, например, 1/1/1990), тогда как 2-й и 3-й столбцы - это числа.matlab plot (x, y) разных типов данных

до сих пор я использовал cell2mat, чтобы преобразовать в 2-й и 3-й столбцы. Таким образом, plot (y) работает {y - это данные 2-го или 3-го столбца}, однако мне интересно, как я могу обрабатывать текстовый тип данных из 1-го столбца при попытке использовать график (x, y).

Любая идея будет оценена по достоинству. веселит

--------sample.csv------------- 
    Date  LAST  Rt 
    1/27/2018 20  0.234556 
    1/26/2019 20.05 0.184556 
    1/23/2040 20.1 0.134556 
    1/22/1990 20.15 0.084556 
    1/21/1991 20.2 0.034556 
    1/20/1993 20.25 -0.015444 
    1/19/1998 20.3 -0.065444 
    1/16/2050 20.35 -0.115444 
    1/15/2030 20.4 -0.165444 

--------cell array appearance------------ 
     1   | 2  | 3 
1| '1/27/2018' 20  0.234556 
2| '1/26/2019' 20.05  0.184556 
3| '1/23/2040' 20.1  0.134556 
4| '1/22/1990' 20.15  0.084556 
5| '1/21/1991' 20.2  0.034556 
6| '1/20/1993' 20.25  -0.015444 
7| '1/19/1998' 20.3  -0.065444 
8| '1/16/2050' 20.35  -0.115444 
9| '1/15/2030' 20.4  -0.165444 
+0

am304: x_dates = cellfun (@ datenum, тест (1, :)). thx i слегка обновил его до x_dates = cellfun (@ datenum, test (:, 1)) в сочетании с графиком (x_dates, y), datetick ('x', 'dd/mm/yyyy'). Поэтому я могу подтвердить, что график работает нормально, хотя по некоторым причинам он добавляет некоторое пробел по оси x. Я думаю, что это чисто косметический материал, над которым я буду работать. Привет, друг, как вы помогли! Лучший, –

ответ

1

Вы также можете использовать datenum преобразовать текст в число серийный дате (скопированного из командной строки Octave):

>> test 
test = 
{ 
    [1,1] = 1/1/2000 
    [1,2] = 1/2/2001 
    [1,3] = 10/2/2001 
    [1,4] = 10/3/2001 
    [1,5] = 10/3/2005 
} 
>> x_dates = cellfun('datenum',test(:,1)) 
x_dates = 

    730486 730853 731126 731127 732588 
>> y = rand(size(x_dates)); 
>> plot(x_dates,y) 
>> datetick('x','dd/mm/yyyy') 

Update:

It выглядит так: cellfun требует дескриптора функции в MATLAB, поэтому вам, вероятно, понадобится d о чем-то вроде:

x_dates = cellfun(@datenum,test(:,1)) 
+0

am304: решение выглядит разумно (преобразование в последовательный, а затем возврат к дате), за исключением того, что x_dates = cellfun ('datenum', abrxeur (1, :)) ведет с моей стороны на Ошибка использования cellfun Неизвестный параметр. ps: я использовал интерфейс для импорта данных csv. Априори это не имеет значения, по сравнению с вашим случаем, когда определяется тест. не так ли? –

+0

Вам нужно показать нам, что выглядит 'abrxeur', по крайней мере, первые 10 строк или около того, чтобы мы могли реплицировать проблему. В противном случае невозможно сказать, что происходит. – am304

+0

am304: только что опубликовал его после редактирования начального сообщения. надеюсь, что это поможет, ура. –

1

Вы можете использовать XTick и XTickLabel. Первый будет устанавливать, где и сколько тиков вам нужно по оси X (я предполагаю, что вам нужно по одному для каждого X-данных, но вы также можете захотеть прыгать с 10 на 10). Второй устанавливает метки в этих положениях тика. Если ярлыки меньше тиков, они будут повторяться, так осторожно с этим.

Позвольте мне проиллюстрировать на примере:

x = [0 1 2 3]; 
y = [2 0 1 1]; 
plot (x, y); 

yourstrings={'Banana', 'T', 'Potato', '45'}; 
set(gca,'XTick',x(1):x(end)) 
set(gca,'XTickLabel',yourstrings) 

enter image description here

Второй вариант будет использовать text. вы можете помещать текст везде, где захотите. Позвольте мне проиллюстрировать еще раз. Конечно, я не собираюсь говорить «хорошо», но если вам нравится, вы можете играть со смещением позиций текстов и т. Д., Чтобы получить более «красивый» сюжет.

x = [0 1 2 3]; 
y = [2 0 1 1]; 
plot (x, y); 

yourstrings={'Banana', 'T', 'Potato', '45'}; 
for ii=1:length(yourstrings) 
    text(x(ii),y(ii),yourstrings{ii}) 
end 

enter image description here

+0

спасибо, понял. но мой вопрос больше посвящен тому, как обрабатывать данные datetime, импортированные в виде текста. в вашем примере предположим, что x = ['1/1/1990' '1/2/1990']; y = [0,2 0,3]. график (x, y), несомненно, приведет к ошибке с использованием графика . Преобразование в двойное от ячейки невозможно в той мере, в какой x нужно рассматривать «адекватно». –

+0

Я думаю, что это совершенно ясно. Сделайте 'x1 = 1: length (x)' '' '' 'ваши строки, а затем используйте любое из приведенных решений. @ N.E.R.D –

0

Вы можете создать новую матрицу используемых данных (или переписать текущий) с помощью цикла через матрицу (:, 1) для преобразования строк с помощью cellfun функцию.

Или просто сюжет:

plot(cellfun(@(x)str2double(x), Measures(:,i))) 

где я = 1: длина (матрица)