Как мне уточнить ось y на графике нормального распределения в Matlab?

#matlab

#matlab

Вопрос:

Моя функция Matlab близка к тому, чтобы делать то, что я хочу. Он принимает вектор оценок и генерирует статистику, включая график нормального распределения. Проблема в том, что ось y, похоже, не отражает частоту учащихся, получающих эту оценку.

Изображение графика нормального распределения

Я просмотрел переполнение стека для всех, кто столкнулся с моей проблемой. Я ничего не смог найти.

 function [M,m,ave,med,dev,v1]=GradeStatistics
% This program accepts grades and gives the maximum, minimum,average(mean), 
% median, standard deviation and also sorts the grades for the user. 
% This program was written by Jacob
clc;clear;close all;format compact;help GradeStatistics;
disp('Enter a vector containing all grades using square brackets')
v=input('Please give me the grades=');
M=max(v);m=min(v);ave=mean(v);med=median(v);dev=std(v);
v1=sort(v);H={'max';'min';'mean';'median';'std'};
G={M;m;ave;med;dev};clc;disp(table(H,G));
All={'max',M;'min',m;'mean',ave;'median',med;'std',dev};
xlswrite('mygrades.xlsx',All);VV1={'sort',v1};
xlswrite('mygrades.xlsx',VV1,1,'A6');
xlswrite('mygrades.xlsx',v1,1,'B6')

disp('Would you like to see a normal distribution?')
Case = input('Enter Y for yes or N for No=','s');
if lower(Case)=='y'
    f=(1/(dev*sqrt(2*pi)))*exp(-0.5*((v1-ave)/dev).^2);
    hold on;plot(v1,f);title('Normal Distribution of Grades')
    xlabel('Score');ylabel('Students')
elseif lower(Case)=='n'
    disp('Thank you for using GradeStatistics')
end
  

Кто-нибудь может показать мне, как получить ось y, которая более точно отражает вектор оценки? Также дайте мне знать, есть ли что-нибудь еще, что я должен знать, чтобы улучшить эту функцию.

Примерный вектор оценки: [0 10 20 23 25 30 35 45 50 53 55 56 58 60 62 65 68 73 74 75 78 80 83 85 90 93 95 98 100]

Комментарии:

1. Привет, FlacOrGtfo! Добро пожаловать в Stack Overflow. Что именно не так с осью Y, которую вы получаете? Являются ли ограничения слишком большими? Слишком маленький? Можете ли вы опубликовать скриншот?

2. Привет, да, вот изображение: i.imgur.com/IR2N27B.png Я бы ожидал больших значений по оси y. Эти значения выглядят слишком маленькими.

3. Совет по переполнению стека: вы можете включить встроенное изображение в свой основной пост, отредактировав его и перетащив файл изображения в область редактирования. Людям легче читать; им не нужно переходить по второй ссылке.

4. Да, они выглядят довольно маленькими. plot() обычно значения верны, так что, возможно, с этим выражением что-то происходит f=(1/(dev*sqrt(2*pi)))*exp(-0.5*((v1-ave)/dev).^2); . Можете ли вы рассказать мне немного больше о том, что это за вычисления? И вы ожидаете, что ось Y увеличится примерно до 1.0 (для общей доли оценок) или больше, как 5 или 10 (для абсолютного числа оценок)?

5. Я ожидаю, что числа, подобные 5, будут находиться в верхней части оси y. И тогда это будет больше похоже на 1 в нижней части оси y.

Ответ №1:

Настройка кода

Хорошо. Сначала давайте немного очистим этот код.

 clc;clear;close all;format compact;help GradeStatistics;
  

Не делайте большую часть этого. clear никогда не требуется в начале функции: все функции автоматически запускаются с новой рабочей области. clc и format compact это должно быть предоставлено пользователю: вы не знаете, каковы их предпочтения отображения. И предоставьте help пользователю вызывать, когда им это нужно. Кроме того, избегайте close all : вы не знаете, есть ли у пользователя какие-то цифры, которые он хотел сохранить!

И нет необходимости вызывать hold , если вы не выполняете несколько графиков по одним и тем же осям, которых здесь нет. Так что удалите этот hold on вызов `.

Далее давайте немного переформатируем код. Поместите каждый оператор в одну строку. Это делает его более читаемым и упрощает отладку с помощью отладчика Matlab, поскольку отладчик устанавливает точки останова и оперирует в основном строкой за раз. И давайте вставим несколько пробелов между токенами для удобства чтения.

 function [M,m,ave,med,dev,v1] = GradeStatistics
% This program accepts grades and gives the maximum, minimum,average(mean), 
% median, standard deviation and also sorts the grades for the user. 
% This program was written by Jacob
disp('Enter a vector containing all grades using square brackets')
v=input('Please give me the grades=');
M=max(v);
m=min(v);
ave=mean(v);
med=median(v);
dev=std(v);
v1=sort(v);
H={'max'; 'min'; 'mean'; 'median'; 'std'};
G={M; m; ave; med; dev};
disp(table(H, G));
All={'max',M; 'min',m; 'mean',ave; 'median',med; 'std',dev};
xlswrite('mygrades.xlsx', All);
VV1={'sort', v1};
xlswrite('mygrades.xlsx', VV1, 1, 'A6');
xlswrite('mygrades.xlsx', v1, 1, 'B6');

disp('Would you like to see a normal distribution?')
Case = input('Enter Y for yes or N for No=','s');
if lower(Case) == 'y'
    f=(1/(dev*sqrt(2*pi)))*exp(-0.5*((v1-ave)/dev).^2);
    plot(v1, f);
    title('Normal Distribution of Grades')
    xlabel('Score');
    ylabel('Students')
elseif lower(Case) == 'n'
    disp('Thank you for using GradeStatistics');
end
  

Исправление графика

Я не уверен, о чем вы спрашиваете, потому что вы не говорите точно, что не так со значениями оси Y / Y, которые вы получаете. Но поскольку вы говорите, что хотите, чтобы ось Y «отражала частоту учащихся, получающих эту оценку», похоже, может быть, вам нужен график гистограммы вместо линейного графика? plot() Функция создает линейный график.

 % Display Histogram
figure
histogram(v, 10);
title('Distribution of grades');
  

Пример гистограммы GradeStatistics

Комментарии:

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

2. Добро пожаловать! Как насчет того, чтобы дать мне преимущество и принять, если это решило вашу проблему?

3. Хороший ответ. Моим единственным предложением было бы добавить преобразование оси y в целочисленные тики только с учетом данных.