Различные метки для каждого столбца на гистограмме с использованием Proc sgplot

Я пытаюсь добавить номер каждой группы в метки групп по оси x, используя Proc sgplot в SAS. Вот данные и график, которые я хотел бы иметь. Я хочу иметь образец каждого бара на оси x (написанные от руки части). Ваша помощь очень ценится!

Data have ;
input type  sex $  n n_total percent ;
datalines;
0  F  6    29  20.7 
1  F  387  496 78.2  
0  M  4    15  26.6
1  M  264  305 86.5
;
Run; 

proc sgplot data=have ;
vbarparm category= type  response=percent /group=sex groupdisplay=cluster datalabel;
run; 

График, который я хочу создать: введите здесь описание изображения


person kiabar    schedule 10.02.2021    source источник
comment
Спасибо за простые в использовании линии данных - сделать это тривиально, чтобы помочь!   -  person Joe    schedule 11.02.2021
comment
Тайцы — очень запутанный граф. Почему полоса с N=29 меньше, чем полоса с N=15?   -  person Tom    schedule 11.02.2021


Ответы (2)


Вы можете вычислить метку данных столбца, которая показывает процентное значение и текст n=‹N›.

Пример:

Data have ;
input type  sex $  n n_total percent ;
datalines;
0  F  6    29  20.7 
1  F  387  496 78.2  
0  M  4    15  26.6
1  M  264  305 86.5
;
Run; 

data plot;
  set have;
  barlabel = cats(percent) || ' %N/(n=' || cats(n_total, ')');
run;

proc sgplot data=plot;
  vbarparm 
    category=type  
    response=percent 
  / group=sex 
    groupdisplay=cluster 
    datalabel=barlabel datalabelfitpolicy=splitalways splitchar='/'
  ;
  label percent = 'Percent N having some attribute';
run; 

введите здесь описание изображения

person Richard    schedule 10.02.2021
comment
Спасибо, Ричард. Ваше предложение работает. Единственное, о чем я думаю, это то, что размещение (n=XX) рядом с % на столбцах может ввести в заблуждение, и читатели могут интерпретировать это n как частоту этого процента, а не общее n. Итак, я думаю, что если мы поместим N на оси X (нижняя часть столбцов), данные будут более четкими. Спасибо еще раз. - person kiabar; 10.02.2021
comment
Вы можете воспринять разделение как более четкое, однако размещение текста на графике заставляет зрителя воспринимать текст как нечто важное, возможно, более важное, чем сама высота столбца. Как только представление увидит %, следующий вопрос будет: % чего? Отделив «что» (n=##) от «%», у зрителя будет больше умственной работы, чтобы найти его. Если у вас есть n = непосредственно рядом (ниже), процентный домен очевиден. - person Richard; 10.02.2021
comment
Если вы не читали Эдварда Тафте (известного своими работами по информационному дизайну и пионера в области визуализации данных — Википедия), ознакомьтесь с его публикациями на сайте www.edwardtufte.com. - person Richard; 10.02.2021

Хотя я согласен с Ричардом в том, что вам, возможно, лучше поместить это в метку столбца, его также легко поместить в таблицу осей.

Data have ;
input type  sex $  n n_total percent ;
datalines;
0  F  6    29  20.7 
1  F  387  496 78.2  
0  M  4    15  26.6
1  M  264  305 86.5
;
Run; 

proc sgplot data=have ;
vbarparm category= type  response=percent /group=sex groupdisplay=cluster datalabel;
xaxistable n_total/class=sex classdisplay=cluster position=bottom location=inside colorgroup=sex;
run; 

classdisplay=cluster делает значения распределенными, как полосы, location=inside помещает их прямо под полосами, а colorgroup=sex делает их окрашенными, как полосы (вместо черного). position=bottom используется по умолчанию, просто выделяя эту опцию.

Вы можете дополнительно настроить то, что отображается, если хотите, таким же образом, как это сделал Ричард, создав текстовую переменную, содержащую именно то, что вы хотите отобразить для каждого, и используя ее как variable (первый аргумент xaxistable). Эта переменная может быть числовой или символьной.

person Joe    schedule 10.02.2021
comment
Спасибо Ричарду и Джо! Комментарий/предложение имеет большой смысл. - person kiabar; 11.02.2021