Обрезка данных для лучшего просмотра на графике журнала - Matlab - PullRequest
4 голосов
/ 21 апреля 2010

просто интересно, есть ли у кого-нибудь идеи по поводу моей проблемы.

У меня достаточно данных, которые необходимо отобразить на одном графике. Две теоретические линии, которые выделены жирным шрифтом и сплошной, отображаются сверху, затем графически представлены 10 наборов экспериментальных данных, которые сходятся к этим линиям, каждая из которых использует свой идентификатор (например, + или o или квадрат и т. Д.). Эти графики представлены в логарифмическом масштабе, который достигает 1e6. Первые несколько десятилетий графика (<1e3) выглядят нормально, но, поскольку все наборы данных сходятся (> 1e3), действительно трудно понять, что это за данные.

Существует более 1000 точек данных за десятилетие, которые можно линейно обрезать до некоторой степени, но если я сделаю это слишком сильно, нижний конец графика пострадает в разрешении.

Что я хотел бы сделать, так это обрезать логарифмически, самое сильное на верхнем уровне, возвращаясь к 0. Мой вопрос: как получить логарифмически масштабированный индексный вектор вместо линейного?

Мое первоначальное предположение состояло в том, что, поскольку мои данные рассчитаны на год, я мог бы просто использовать линейный индекс для сокращения, что привело бы к чему-то вроде этого (но за все десятилетия):

//%grab indicies per decade
ind12 = find(y >= 1e1 & y <= 1e2);
indlow = find(y < 1e2);
indhigh = find(y > 1e4);
ind23 = find(y >+ 1e2 & y <= 1e3);
ind34 = find(y >+ 1e3 & y <= 1e4);

//%We want ind12 indexes in this decade, find spacing
tot23 = round(length(ind23)/length(ind12));
tot34 = round(length(ind34)/length(ind12));

//%grab ones to keep
ind23keep = ind23(1):tot23:ind23(end);
ind34keep = ind34(1):tot34:ind34(end);

indnew = [indlow' ind23keep ind34keep indhigh'];

loglog(x(indnew), y(indnew));

Но это приводит к тому, что чернослив ведет себя нервно. Каждое десятилетие имеет количество точек, которые мне бы хотелось, но, поскольку это линейное распределение, точки, как правило, накапливаются в верхнем конце десятилетия в логарифмическом масштабе.

Есть идеи, как мне это сделать?

Ответы [ 2 ]

3 голосов
/ 21 апреля 2010

Я думаю, что самый простой способ сделать это - использовать функцию LOGSPACE для генерации набора индексов в ваших данных. Например, чтобы создать набор из 100 точек, логарифмически разнесенных от 1 до N (количество точек в ваших данных), вы можете попробовать следующее:

indnew = round(logspace(0,log10(N),100));  %# Create the log-spaced index
indnew = unique(indnew);                   %# Remove duplicate indices
loglog(x(indnew),y(indnew));               %# Plot the indexed data

Создание логарифмически разнесенного индекса, подобного этому, приведет к тому, что меньшее число значений будет выбрано из конца вектора относительно начала, что приведет к более строгой обрезке значений к концу вектора и улучшит вид логарифмического графика. Поэтому он будет наиболее эффективен с векторами, отсортированными в порядке возрастания.

1 голос
/ 21 апреля 2010

Насколько я понимаю, проблема в том, что ваши значения x линейно разнесены, так что если вы построите их логарифмически, в «более высокие» десятилетия будет гораздо больше точек данных, так что маркеры будут находиться очень близко друг к другу.Например, если x идет от 1 до 1000, в первом десятилетии будет 10 баллов, во втором - 90, а в третьем - 900.Вы хотите иметь, скажем, 3 очка за десятилетие.

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

Второе решение заключается в создании индекса с неравномерным интервалом.Вот как вы можете это сделать.

%# create some data
x = 1:1000;
y = 2.^x;

%# plot the graph and see the dots 'coalesce' very quickly
figure,loglog(x,y,'.')

%# for the example, I use a step size of 0.7, which is `log(1)`
xx = 0.7:0.7:log(x(end)); %# this is where I want the data to be plotted

%# find the indices where we want to plot by finding the closest `log(x)'-values
%# run unique to avoid multiples of the same index
indnew = unique(interp1(log(x),1:length(x),xx,'nearest'));

%# plot with fewer points
figure,loglog(x(indnew),y(indnew),'.')
...