SAS: отображение дат без выходных с использованием PROC SGPLOT

Я использую SAS 9.3 и пытаюсь создать график с использованием PROC SGPLOT, который (1) показывает только даты, содержащиеся в моем наборе данных, как последовательные даты (т. е. исключая выходные и праздничные дни), а (2) отображает полезную информацию о XAXIS (например, первый день месяца). Я могу сделать и то, и другое по отдельности, но я не могу понять, как это сделать вместе. В частности, параметры VALUE и TICKVALUEFORMAT кажутся отключенными, когда я использую параметр DISCRETE (я не вижу обсуждения этого в документации).

Итак, у меня есть 2 вопроса:

(1) Есть ли способ решить это взаимодействие между опцией DISCRETE и VALUES/TICKVALUES?

(2) Есть ли лучший способ сделать то, что я пытаюсь сделать?

(ИДЕАЛЬНО было бы построить переменные X и Y и использовать третью переменную в качестве меток для оси X, но я не могу найти способ сделать это.)

Вот пример кода, иллюстрирующий это; если исключить выходные/праздничные дни, то код должен отображать прямую линию (я приложил графики, сгенерированные ниже):

*Create Dataset of Weekdays, dropping some holidays;
data weekdays (where=(weekday~=1 and weekday~=7 and date~="01JAN1960"d));
format date date9.;
do i=0 to 100;
  date=i;
  weekday=weekday(date);
  year=year(date);
  month=year*100+month(date);
  output;
end;
drop i; 
run;

*Create line and data label;
data weekdays;
  set weekdays;
  line=_n_;
  format xlab $12.;
  by month;
  if first.month then xlab=put(date,monyy7.);
run;

Следующее отображает даты как ДИСКРЕТНЫЕ точки: точки данных отображаются правильно, но команды VALUES и TICKVALUEFORMAT не влияют:

*Plot dates as discrete -- correct points, VALUES and TICKVALUEFORMAT have no effect;
proc sgplot data=weekdays;
  series x=date y=line;
  scatter x=date y=line;
  xaxis type=discrete DISCRETEORDER=DATA values=(3 31 60 91) TICKVALUEFORMAT=monyy7.;
run;

Вот первый график: правильные точки, неправильная ось

Следующий код тот же, но удаляет опцию DISCRETE, и поэтому он отображается как ось дат, которая, очевидно, включает выходные, но работают опции VALUE и TICKVALUEFORMAT:

*Plot all dates as dates -- incorrect points, but VALUE and TICKVALUEFORMAT work;
proc sgplot data=weekdays;
  series x=date y=line;
  scatter x=date y=line;
  xaxis values=(3 31 60 91) TICKVALUEFORMAT=monyy7.;
run;

Вот второй график: неправильные точки, но рабочая ось

Любые предложения будут тепло приветствоваться! Спасибо!


person Eric    schedule 29.09.2017    source источник


Ответы (1)


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

Один из способов обойти это — использовать ось x2 и вторичную переменную.

Здесь, на этапе создания, я добавляю счетчик, который будет считать линейно — то, что вы делаете. Итак 1,2,3,4,5.

*Create Dataset of Weekdays, dropping some holidays;
data weekdays ;
format date date9.;
do i=0 to 100;
  date=i;
  weekday=weekday(date);
  year=year(date);
  month=year*100+month(date);
  if (weekday~=1 and weekday~=7 and date~="01JAN1960"d) then do;
    counter+1;
    output;
  end;
end;
run;

*Create line and data label;
data weekdays;
  set weekdays;
  line=_n_;
  format xlab $12.;
  by month;
  if first.month then xlab=put(date,monyy7.);
run;

Теперь я добавляю «фиктивный» график, который намеренно не отображается (белый и прозрачный), но сообщает SAS, что использовать для XAxis. Что я просто использую обычный FORMAT, чтобы добраться до правильных меток значений. Затем я говорю другим графикам использовать X2AXIS, что означает, что они могут составить свою собственную ось (и удалить DISPLAY=NONE, если вы хотите увидеть, как это будет выглядеть), но все равно выглядеть одинаково.

*Plot dates as discrete -- correct points, VALUES and TICKVALUEFORMAT have no effect;
proc sgplot data=weekdays tmplout="c:\temp\test_sgplot2.sas";
    scatter x=date y=line/markeropts=(color=white) transparency=1;
    format date monyy7.;
  series x=counter y=line/x2axis;
  scatter x=counter y=line/x2axis;
  xaxis values=(3 31 60 91) type=discrete discreteorder=data TICKVALUEFORMAT=monyy7.;
  x2axis display=none;
run;
person Joe    schedule 29.09.2017
comment
Кстати, если вы еще этого не сделали; Я бы разместил сообщение на community.sas.com в графическом пространстве и посмотрел бы, получите ли вы лучший ответ. Это работает для того, что вы хотите, но это немного глупый способ сделать это. Санджай или Дэн, разработчики из SAS или, возможно, кто-то другой, могут предложить лучший способ. - person Joe; 29.09.2017
comment
Большое спасибо. Это именно то, что мне было нужно. - person Eric; 29.09.2017