首页 > 解决方案 > R在轴线处打破线型规则

问题描述

我正在尝试根据我的数据框中名为 TB 的列使用不同的线型绘制 2 个变量。下面显示的是我使用的代码:

q=ggplot()+geom_line(aes(deg_b,glim_f,colour=state,linetype=TB),min_splits_mp)+
  scale_linetype_manual(values=c(1,4))+
  geom_point(data = min_splits_mp, mapping = aes(x = deg_b, y = glim_f,colour=state, shape=TB,size=TB)) +
  scale_shape_manual(values=c(0,4))+
  scale_size_manual(values=c(3,4))+
  scale_color_manual(values=c("blue","red"))+
  ggtitle(paste(domain," Degredation vs best_split(Both tiebreaks)")) 
print(q)

TB 列是离散的。

当我运行此代码时,将绘制以下内容: 在此处输入图像描述

为了完整起见,这里是我正在使用的数据:

      State         deg_b  glim_F   TB
1   7,5,9,2,1,3,6,0,8,4 0   3   Average case
2   6,2,4,8,3,0,5,9,1,7 0   9   Average case
3   6,2,4,8,3,0,5,9,1,7 0   10  Average case
4   6,2,4,8,3,0,5,9,1,7 0   9   Average case
5   6,2,4,8,3,0,5,9,1,7 0   10  Average case
6   7,5,9,2,1,3,6,0,8,4 1   5   Average case
7   6,2,4,8,3,0,5,9,1,7 1   5   Average case
8   7,5,9,2,1,3,6,0,8,4 2   5   Average case
9   6,2,4,8,3,0,5,9,1,7 2   5   Average case
10  7,5,9,2,1,3,6,0,8,4 3   5   Average case
11  6,2,4,8,3,0,5,9,1,7 3   5   Average case
12  7,5,9,2,1,3,6,0,8,4 0   9   Best TB
13  7,5,9,2,1,3,6,0,8,4 0   10  Best TB
14  7,5,9,2,1,3,6,0,8,4 0   8   Best TB
15  7,5,9,2,1,3,6,0,8,4 0   9   Best TB
16  7,5,9,2,1,3,6,0,8,4 0   10  Best TB
17  6,2,4,8,3,0,5,9,1,7 0   0   Best TB
18  6,2,4,8,3,0,5,9,1,7 0   1   Best TB
19  6,2,4,8,3,0,5,9,1,7 0   2   Best TB
20  6,2,4,8,3,0,5,9,1,7 0   3   Best TB
21  6,2,4,8,3,0,5,9,1,7 0   4   Best TB
22  6,2,4,8,3,0,5,9,1,7 0   5   Best TB
23  6,2,4,8,3,0,5,9,1,7 0   6   Best TB
24  6,2,4,8,3,0,5,9,1,7 0   7   Best TB
25  6,2,4,8,3,0,5,9,1,7 0   8   Best TB
26  6,2,4,8,3,0,5,9,1,7 0   9   Best TB
27  6,2,4,8,3,0,5,9,1,7 0   10  Best TB
28  6,2,4,8,3,0,5,9,1,7 0   0   Best TB
29  6,2,4,8,3,0,5,9,1,7 0   1   Best TB
30  6,2,4,8,3,0,5,9,1,7 0   2   Best TB
31  6,2,4,8,3,0,5,9,1,7 0   3   Best TB
32  6,2,4,8,3,0,5,9,1,7 0   4   Best TB
33  6,2,4,8,3,0,5,9,1,7 0   5   Best TB
34  6,2,4,8,3,0,5,9,1,7 0   6   Best TB
35  6,2,4,8,3,0,5,9,1,7 0   7   Best TB
36  6,2,4,8,3,0,5,9,1,7 0   8   Best TB
37  6,2,4,8,3,0,5,9,1,7 0   9   Best TB
38  6,2,4,8,3,0,5,9,1,7 0   10  Best TB
39  7,5,9,2,1,3,6,0,8,4 1   5   Best TB
40  7,5,9,2,1,3,6,0,8,4 1   4   Best TB
41  6,2,4,8,3,0,5,9,1,7 1   6   Best TB
42  6,2,4,8,3,0,5,9,1,7 1   5   Best TB
43  7,5,9,2,1,3,6,0,8,4 2   6   Best TB
44  7,5,9,2,1,3,6,0,8,4 2   5   Best TB
45  6,2,4,8,3,0,5,9,1,7 2   6   Best TB
46  6,2,4,8,3,0,5,9,1,7 2   5   Best TB
47  7,5,9,2,1,3,6,0,8,4 3   6   Best TB
48  7,5,9,2,1,3,6,0,8,4 3   5   Best TB
49  6,2,4,8,3,0,5,9,1,7 3   5   Best TB
50  6,2,4,8,3,0,5,9,1,7 3   4   Best TB

请注意,最好的 TB 应该在点之间有一条虚线(例如,有机圆中的线)。然而奇怪的是,在 deg_b=0 时情况并非如此,蓝色 X 之间的线是一条没有断开的虚线(参见黑色圆圈)。为什么是这样?

标签: rggplot2

解决方案


没有看到你的数据很难确定,但我猜 deg_b=0 处的垂直蓝线是重叠绘制两条或更多条相对于彼此略微移动(沿线的方向)的线的结果,创建虚线的外观,其中每条重叠线单独为点划线。

例如,请注意下图中下部线的一部分看起来是虚线的,即使两条单独的重叠线是点划线:

d = data.frame(x = c(1, 5, 1, 4, 2, 6),
               y = c(1, 5, 2, 5, 2, 6),
               lt = rep(c("A","B","A"), each=2),
               group = rep(c("a","b","c"), each=2))

ggplot(d, aes(x, y, linetype=lt, group=group)) + 
  geom_line(size=0.5) +
  scale_linetype_manual(values=c(4,1)) + 
  theme_classic()

在此处输入图像描述

此外,您可以缩短代码如下:

ggplot(min_splits_mp, aes(deg_b, glim_f, colour=state, linetype=TB)) +
  geom_line()+
  geom_point(aes(shape=TB, size=TB)) +
  scale_linetype_manual(values=c(1,4)) +
  scale_shape_manual(values=c(0,4)) +
  scale_size_manual(values=c(3,4)) +
  scale_color_manual(values=c("blue","red"))+
  ggtitle(paste(domain," Degredation vs best_split(Both tiebreaks)")) 

如果您要在 each 中使用相同的数据框geom,您可以将数据框放在对 ggplot 的主调用中,而不是在每个 geom 中重复它。同样,适用于所有几何图形的美学映射(里面的东西aes)也可以放在主 ggplot 调用中,而不是在每个几何图形中重复它们。唯一需要geom_point单独进行的映射是size=TB因为您不希望线宽针对不同级别的TB.


推荐阅读