SAS绘制折线图如何去除x轴OLD标签或将OLD作为单独数据点展示
问题根因
你当前的折线图异常是因为policy_vintage是数值型日期变量,你自定义的格式仅修改了显示值,未改变原始数值,SGPLOT默认将其识别为连续轴,所有映射为OLD的早于2020-07-31的日期数值都集中在x轴最左侧,导致折线显示异常。
方案1:X轴仅展示日期值,移除OLD分类
直接在绘图步骤过滤掉所有归类为OLD的观测即可,只保留2020年8月及之后的日期数据:
proc sgplot data=diff1; /* 过滤掉OLD对应的观测 */ where policy_vintage > '31JUL2020'd; series x=policy_vintage y=POLICY_TODAY / markerattrs=(color=vligb symbol=circlefilled size=20) lineattrs=(color=vligb thickness=2); series x=policy_vintage y=POLICY_PRIOR / y2axis markerattrs=(color=salmon symbol=circlefilled size=9) lineattrs=(color=salmon thickness=2); run;
处理后x轴只会显示正常的日期序列,不会出现OLD相关内容,折线会按日期顺序正常排列。
方案2:保留OLD作为单个独立数据点展示
需要将x轴转换为离散轴,统一存储OLD和日期字符串作为分类值,保证OLD作为单独分类显示:
- 首先修改数据集生成逻辑,新增字符型的x轴分类变量,保证排序正确:
proc sql; create table diff1 as select today.policy_vintage , put(today.policy_vintage, vintf.) as x_label length=20 , POLICY_TODAY , POLICY_PRIOR , POLICY_TODAY - POLICY_PRIOR as DIFFERENCE from newdiff today LEFT JOIN (select * from _work.POLICY_VINTAGE_WEEKLY where run_date < today() having run_date = max(run_date) ) prior ON today.policy_vintage = prior.policy_vintage order by policy_vintage; quit;
- 修改绘图代码,指定x轴为离散类型,按数据顺序展示分类:
proc sgplot data=diff1; xaxis type=discrete discreteorder=data label="Policy Vintage"; series x=x_label y=POLICY_TODAY / markerattrs=(color=vligb symbol=circlefilled size=20) lineattrs=(color=vligb thickness=2); series x=x_label y=POLICY_PRIOR / y2axis markerattrs=(color=salmon symbol=circlefilled size=9) lineattrs=(color=salmon thickness=2); run;
处理后OLD会作为x轴的第一个分类点单独展示,后续依次排列所有日期点,折线连接逻辑符合预期。
内容的提问来源于stack exchange,提问作者user17322178
相关产品推荐
相关产品推荐

