2016-03-25 2 views
0

У меня есть 2-х весовые функции вероятности из 2-х категорий. Я пытаюсь построить контуры, чтобы визуализировать их (например, на их половине высоты, но на самом деле не имеет значения).несколько графиков контура matlab с одним уровнем

Я не хочу использовать contourf для прямой печати, потому что я хочу контролировать цвет заливки и непрозрачность. Поэтому я использую contourc для генерации координат xy, а затем используя fill с этими координатами xy.

Проблема в том, что координаты xy из функции contourc имеют в них странные числа, которые вызывают нанесение следующих странных вершин.

enter image description here

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

contourmatrix = contourc(x, y, Z, [val, val]); 
h = fill(contourmatrix(1,:), contourmatrix(2,:), 'r'); 

Кто-нибудь знает, почему contourmatrix имеет эти нечетные значения в них, когда я прошу только одного контура?

UPDATE:

Моя проблема кажется может быть режим Провал contourc, когда входной 2D матрица не «гладко». Мои исходные данные представляют собой большой набор (x, y) точек. Затем я создаю 2D-матрицу с некоторой функцией hist2d. Но когда это шумное проблема преувеличена ... enter image description here

Но когда я использую функцию 2d плотности ядра, чтобы привести к более плавному 2D функции, проблема уменьшается ... enter image description here

полный процесс а) у меня есть набор (х, у) точек, которые образуют образцы из распределения б) преобразовать это в 2D PMF с) создать contourmatrix с использованием contourc г) участок с использованием fill

+1

могли бы вы предоставить простой пример с образцами данных – Hoki

+0

Спасибо за добавление информации, но это на самом деле не позволяют нам помочь до тех пор, как мы делаем не имеют данных, необходимых для воспроизведения вашей проблемы. Так что либо загрузите набор данных где-нибудь (google drive/dropbox, ...), поделитесь ссылкой и покажите код, используемый для создания вашей фигуры, или составите более простой пример с образцами данных, которые легко сгенерировать. В любом случае нам нужно увидеть ваш код, чтобы узнать, что происходит не так. – Hoki

+0

хотя я подозреваю, что ваши паразитные линии исходят из опорных точек. Посмотрите внимательно на структуру ContourMatrix, некоторые точки там не являются координатами, а указывают уровень и количество точек, которые следует учитывать для данного профиля. Эти пункты не должны включаться в команду 'fill'. Поэтому, отправляя 'contourmatrix (1, :)' в функцию заполнения, вы отправляете дополнительные баллы. Если контур определяется только одной формой, вы должны использовать по крайней мере 'contourmatrix (1,2: end)' (не отправляйте первый столбец). Если существует более одной формы для изолеста, вам нужно проанализировать матрицу контура. – Hoki

ответ

1

Ваши графические ошибки связаны с тем, как вы используете данные из ContourMatrix. Даже если вы укажете только один изолевел, это может привести к нескольким различным заполненным областям. Таким образом, ContourMatrix может содержать данные для нескольких фигур.


простой пример:

isolevel = 2 ; 
[X,Y,Z] = peaks ; 
[C,h] = contourf(X,Y,Z,[isolevel,isolevel]); 

Производит:

contourf output


Обратите внимание, что даже если вы указали только один isolevel быть нарисованы, это приведет к 2 пластырей (2 формы). Каждый из них имеет свое собственное определение, но они оба встроены в ContourMatrix, поэтому вам нужно проанализировать его, если вы хотите, чтобы вы каждый раз определяли координаты каждой фигуры.

Чтобы доказать точку, если я просто бросить полную матрицу контура на patch функции (функцииfillбудет создавать объекты патча в любом случае, так что я предпочитаю использовать эту функцию при практических низком уровне). Я получаю ту же глюк линию, как и вы:

xc = X(1,:) ; 
yc = Y(:,1) ; 
c = contourc(xc,yc,Z,[isolevel,isolevel]); 
hold on 
hp = patch(c(1,1:end),c(2,1:end),'r','LineWidth',2) ; 

производит такой же глюки, что у вас есть:

not parsed


Теперь, если вы правильно извлечь каждую форму координат без включая вы получите правильные формы. Пример ниже - это один из способов извлечь и нарисовать каждую форму для вдохновения, но у них много способов сделать это по-другому. Вы можете, конечно, компактно кодировать код, но здесь я подробно описал операции для ясности.

Ключ должен читать и понимать, как строится ContourMatrix.

parsed = false ; 
iShape = 1 ; 
while ~parsed 
    %// get coordinates for each isolevel profile 
    level = c(1,1) ; %// current isolevel 
    nPoints = c(2,1) ; %// number of coordinate points for this shape 

    idx = 2:nPoints+1 ; %// prepare the column indices of this shape coordinates 
    xp = c(1,idx) ;  %// retrieve shape x-values 
    yp = c(2,idx) ;  %// retrieve shape y-values 
    hp(iShape) = patch(xp,yp,'y','FaceAlpha',0.5) ; %// generate path object and save handle for future shape control. 

    if size(c,2) > (nPoints+1) 
     %// There is another shape to draw 
     c(:,1:nPoints+1) = [] ; %// remove processed points from the contour matrix 
     iShape = iShape+1 ;  %// increment shape counter 
    else 
     %// we are done => exit while loop 
     parsed = true ; 
    end 
end 
grid on 

Это произведет:

enter image description here

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