2014-11-19 3 views
0

Что я хочу сделать очень просто, я просто не могу заставить MATLAB это сделать. Я хотел бы построить контуры, используя мой 2D-набор данных.Контурный график MATLAB 2D-разброса

Мой набор данных большой; 2 х 844240. я могу сделать график рассеяния просто отлично,

scatter(Data(1,:), Data(2,:)); 

Читая на форумах, я нашел Scatter plot with density in Matlab, где была построена hisogram. Однако этого было бы достаточно, я бы хотел наложить сюжеты.

enter image description here

Вопрос заключается в том, что они имеют разные оси, мои данные рассеяния имеет ось [0 0,01 0 2500]; тогда как гистограмма равна [0 100 0 100].

Есть ли способ изменить значения оси гистограммы без изменения изображения?

Спасибо!

+1

С вопросом, не совсем понятно, что вы будете контурировать. Чтобы добраться до контуров, в третьем измерении должно быть значение. Похоже, вы могли бы попытаться построить плотность точек, это правильно? – TTT

+0

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

ответ

2

Если я правильно понял, вы используете hist3 для построения гистограммы, а затем используя imagesc, чтобы построить его. Вы можете использовать второй выходной аргумент hist3 для получения центров гистограмм, а затем передать их на imagesc, например.

nBins_x = 100; 
nBins_y = 100; 
[counts, bin_centers] = hist3(Data, [nBins_x nBins_y]); 
x_bin_centers = bin_centers{1}; 
y_bin_centers = bin_centers{2}; 
imagesc(x_bin_centers, y_bin_centers, counts) 

Пара Другие ноты:

  • В вашем случае, вам нужно будет перенести вашу матрицу [2 х N] при прохождении его hist3, который ожидает [N × 2] матрица ,

  • imagesc ставит первую ось (которую я называл осью «x») на вертикальной оси, а второй - на горизонтальной оси. Если вы хотите, чтобы перевернуть его, вы можете использовать:

    imagesc(y_bin_centers, x_bin_centers, counts') 
    
  • Если вы хотите задать гистограммы Лари явно (например, чтобы они соответствовали вашему разбросу) вы можете указать, что в доводах для hist3:

    x_bin_centers = linspace(0, .01, 100); 
    y_bin_centers = linspace(0, 2500, 100); 
    counts = hist3(Data, {x_bin_centers, y_bin_centers}; 
    

И если вы хотите контурный график, вы можете использовать (обратите внимание, что contour принимает аргументы осей в другом порядке, чем imagesc):

contour(x_bin_centers, y_bin_centers, counts'); 

Если вы недовольны зубчатость контуров, вы можете рассмотреть вопрос использования оценки плотности ядра вместо гистограммы (проверить ksdensity) (ой, выглядит ksdensity только 1-D. Но есть представления File Exchange для двумерной оценки плотности ядра).

+0

Кажется, это сработает! Я дам ему попробовать позже сегодня!Спасибо, я очень ценю количество деталей в вашем ответе. –

+0

При попытке вашего кода я обнаружил, что ось на рисунке не изменяется с графиком. Поэтому я остаюсь с линией (поскольку данные x только от 0 до 0,01, но ось x показывает от 0 до 100). Я думаю, что все правильно построено, мне просто нужно правильно отобразить его. Есть ли у вас какие-либо предложения? Я попытался использовать 'set (gca, 'xlim', [0 0.01]);' безрезультатно. –

+0

Извините, моя ошибка. У меня была «ось равная», которая испортила ее. Еще раз спасибо! Работал как шарм! –

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