Матлаб диаграммы рассеяния

У меня возникли проблемы с графиком scatter.

Я рисую матрицу, содержащую оценки за задание для студентов, например. [задания x оценки], но если более одного учащегося получают одинаковую оценку за одно и то же задание, баллы будут начисляться друг на друга. Я хочу добавить небольшое случайное число (от -0,1 до 0,1) к координатам x и y каждой точки.

По оси X должно быть количество заданий, а по оси Y — все оценки.

матрица оценок определяется как матрица 12x4

Мой код выглядит так:

n_assignments = size(grades,2);  % Total number of assignments.
n_students = size(grades,1);    % Total number of student.
hold on;                    % Retain current plot when adding new plots.
for i = 1:n_assignments     % Loop through every assignment.
% Scatter plot of assignment vs grades for that assignment.
% One assignment on every iteration.
scatter(i*ones(1, n_students), grades(i, :), 'jitter', 'on', 'jitterAmount', 0.1);
end
hold off;                   % Set the hold state to off.
set(gca, 'XTick', 1:n_assignments); % Display only integer values in x-axis.
xlabel('assignment');       % Label for x-axis.
ylabel('grades');           % Label for y-axis.
grid on;                    % Display grid lines.

Но я продолжаю получать сообщение об ошибке:

X and Y must be vectors of the same length.

person Ryan    schedule 04.05.2017    source источник


Ответы (1)


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

В этом ответе я расскажу о функции scatter 'jitter'.

Обратите внимание, что 'jitter' влияет только на ось X, но не на ось Y (дополнительная информация на Недокументировано Матлаб).

Взгляните на этот пример, который я сделал на основе вашего описания:

Предположим, у вас есть класс с 20 учениками, и они выполнили 5 заданий. Оценки за задания хранятся в матрице (grades), где строки — это задания, а столбцы — учащиеся.

Затем я просто создаю scatter график данных в grades матрице, по одной строке за раз, в for и с помощью hold on сохранить все графика на той же фигуре.

n_assignments = 5;  % Total number of assignments.
n_students = 20;    % Total number of students.

grades = randi(10, n_assignments, n_students);  % Random matrix of grades.

hold on;                    % Retain current plot when adding new plots.
for i = 1:n_assignments     % Loop through every assignment.
    % Scatter plot of assignment vs grades for that assignment.
    % One assignment on every iteration.
    scatter(i*ones(1, n_students), grades(i, :), 'jitter', 'on', 'jitterAmount', 0.1);
end
hold off;                   % Set the hold state to off.

set(gca, 'XTick', 1:n_assignments); % Display only integer values in x-axis.
xlabel('assignment');       % Label for x-axis.
ylabel('grades');           % Label for y-axis.
grid on;                    % Display grid lines.

Вот результат:

График рассеяния с дрожанием


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

person codeaviator    schedule 04.05.2017
comment
Это именно то, что я хотел, но когда я пытаюсь написать более общее, я не могу заставить его работать должным образом, он не отображает все оценки. Я внес следующие изменения в код: grades is difined as a 12x4 matrix n_assignments = size(grades,2); n_students = size(grades,1); hold on; for i = 1:n_assignments scatter(i*ones(1, n_students), grades(i, :), 'jitter', 'on', 'jitterAmount', 0.1); end hold off; set(gca, 'XTick', 1:n_assignments); Но он выдает сообщение об ошибке: Ошибка при использовании разброса (строка 61) X и Y должны быть векторами одинаковой длины. - person Ryan; 04.05.2017
comment
@Ryan Пожалуйста, не могли бы вы отредактировать свой вопрос и добавить новый фрагмент кода внизу (не удаляя то, что вы уже написали). Комментарии, как правило, не лучшее место для обмена кодом. Спасибо. - person codeaviator; 04.05.2017