两个多月前我将“抽时间把积累下来的东西捋捋、整理出来”这件事放到了我的年度目标里,考虑到模型那套东西涉及的方方面面太多了,从那开始整理的话恐怕又要食言而肥了,于是先整理一些最简单的东西。
图形展示中有三种最基础的形式,俗称“折柱饼”,一般用折线图看趋势、用饼图看占比、用柱状图对比大小。其中竖着放的柱状横过来就变成了条形,因此这篇笔记中既包含竖着的柱状图也包括横着的条形图。
R里面的内置数据集我不熟悉,随便翻了翻也没找到合适的面板数据,在正式画图之前先编造一份基础数据:
data<-data.frame(
area=c('area1','area2','area3','area4','area5','area6','area7','area8'),
value1=sample(1:10,8),
value2=sample(1:10,8),
value3=sample(1:10,8),
value4=sample(1:10,8),
value5=sample(50:100,8)
)
1.基础定义 🔗
echarts4r包的所有参数设置细节都可以去官网查找,有必要的话还可以去echarts的官网查找更细致的参数设定。
若使用4.1.0及以上版本的R,则所有%>%
需要换成|>
。
先用基础数据画一个最普通的柱状图:
library(echarts4r)
data%>%
e_charts(area)%>% #横轴
e_bar(value1) #纵轴,e_bar代表柱状图
1.1.坐标轴(axis) 🔗
echarts4r包中的函数通常都有默认参数,横轴通常默认间隔1来展示具体标签,若要调整横轴需要设置e_x_axis()
,若要调整纵轴的间隔需要设置e_y_axis()
。
data %>%
e_charts(area) %>%
e_bar(value1) %>%
e_x_axis(axisLabel = list(interval = 0), name = "X轴") %>%
#将横轴标签间隔调整为0,这样每个坐标轴标签都会显示出来
#有时候坐标轴标签太长,也可以设置旋转角度如axisLabel = list(interval = 0, rotate = 30)
e_y_axis(
min = 0, #Y轴最小值
max = 10, #Y轴最大值
interval = 5, #Y轴间隔
name = "Y轴" #增加Y轴的名字
)
|
|
---|
1.2.标签(label)&提示(tooltip) 🔗
提示工具就是鼠标放到柱子上时会显示出来的内容。
data %>%
e_charts(area) %>%
e_bar(value1, name = "数据项的名字") %>%
e_labels(fontSize = 9, #设置数据标签的字体大小
position = "top") %>% #设置数据标签的位置如top,buttom,inside
e_tooltip() #可设置参数trigger = "item"和trigger = "axis",提示内容一样但格式不一样
|
|
---|
1.3.标记(mark) 🔗
echarts4r包提供三种标记方式:标记点(e_mark_point
)、标记线(e_mark_line
)、标记区域(e_mark_area
)。
#可以这样写
data %>%
e_charts(area) %>%
e_bar(value1, name = "数据项的名字") %>%
e_mark_point("数据项的名字", data = list(type = "min")) %>% #标记最小值
e_mark_point("数据项的名字", data = list(type = "max")) %>% #标记最大值
e_mark_line("数据项的名字", data = list(type = "average")) %>% #标记平均值
e_mark_area(
serie = "数据项的名字",
data = list(list(xAxis = "min", yAxis = 8),
list(xAxis = "max", yAxis = 10)),
itemStyle = list(color = "lightblue")
) #标记区域
#也可以这样写
max <- list(name = "Max",
type = "max")
min <- list(name = "Min",
type = "min")
avg <- list(type = "average",
name = "AVG")
data %>%
e_charts(area) %>%
e_bar(value1) %>%
e_mark_point("value1", data = min) %>%
e_mark_point("value1", data = max) %>%
e_mark_line("value1", data = avg)
如果要同时对多个数据项标记,可以写e_mark_point(c("value1","value2"), data = min)
,前提是前面也有e_bar(value2)
|
|
---|
1.4.图例(legend)&标题(title) 🔗
当需要显示许多数据项时,需要对图例做详细设置,以后遇到复杂情况时再把这部分展开细写。
data %>%
e_charts(area) %>%
e_bar(value1) %>%
e_legend(show = FALSE) #不显示图例
data %>%
e_charts(area) %>%
e_bar(value1) %>%
e_legend(right = TRUE)%>% #左(left)、中(center)、右(right);上(top)、中(middle)、下(buttom)
e_title('主标题','副标题')
|
|
---|
2.堆叠(stack) 🔗
当需要展示的数据项不止一个时,可以根据业务需要进行堆叠:
#四个数据项并排展示
data %>%
e_charts(area) %>%
e_bar(value1) %>%
e_bar(value2) %>%
e_bar(value3) %>%
e_bar(value4) %>%
e_x_axis(axisLabel = list(interval = 0))
#四个数据项全堆到一起
data %>%
e_charts(area) %>%
e_bar(value1, stack = "grp") %>%
e_bar(value2, stack = "grp") %>%
e_bar(value3, stack = "grp") %>%
e_bar(value4, stack = "grp") %>%
e_x_axis(axisLabel = list(interval = 0))
#四个数据项分成两堆
data %>%
e_charts(area) %>%
e_bar(value1, stack = "grp1") %>%
e_bar(value2, stack = "grp1") %>%
e_bar(value3, stack = "grp2") %>%
e_bar(value4, stack = "grp2") %>%
e_x_axis(axisLabel = list(interval = 0))
|
|
|
---|
全堆到一起的情况,也可以展示各个数据项的占比:
#计算占比
data.1 <-
data %>% dplyr::mutate(
value1_rate = round(value1 / (value1 + value2 + value3 + value4), 2),
value2_rate = round(value2 / (value1 + value2 + value3 + value4), 2),
value3_rate = round(value3 / (value1 + value2 + value3 + value4), 2),
value4_rate = round(value4 / (value1 + value2 + value3 + value4), 2)
)
data.1 %>%
e_chart(area) %>%
e_bar(value1_rate, stack="grp") %>%
e_bar(value2_rate, stack="grp") %>%
e_bar(value3_rate, stack="grp") %>%
e_bar(value4_rate, stack="grp") %>%
e_x_axis(axisLabel = list(interval = 0))%>% #设置横轴间隔为0
e_y_axis(max=1,formatter = e_axis_formatter("percent", digits = 0))%>% #设置Y轴最大值为100%
e_legend(type='scroll') #数据项很多时,可以设置图例滚动展示
3.双轴 🔗
同时需要展示多个数据项但是数据的量级存在差异时,可以考虑用两个Y轴来展示:
#下面是我瞎碰乱试出来的,备注的文字仅仅是我的猜想
data %>%
e_chart(area) %>%
e_line(value1) %>% #没有y_index参数时默认左侧Y轴为主轴
e_bar(value5, y_index = 1) %>% #设置了y_index=1时,默认用的是右侧Y轴即副轴
e_y_axis(
min = 0,
max = 10,
interval = 5,
name = "左侧Y轴"
) %>%
e_y_axis(
index = 1, #对副轴进行设置
min = 0,
max = 100,
interval = 20,
name = "右侧Y轴"
)
4.时间轴(timeline) 🔗
虽然名字是时间轴,但是也可以用于将数据分组后展示:
data.2 <- data.frame(
type = c('type1','type1','type1','type1','type2','type2','type2','type2'),
area = c('area1','area2','area3','area4','area1','area2','area3','area4'),
value1 = sample(1:10, 8)
)
data.2 %>%
group_by(type) %>% #分组
e_charts(area, timeline = TRUE) %>% #横轴
e_bar(value1) %>%
e_timeline_opts(axis_type = "category",
top = 5) #通常时间轴默认放在图形下方,也可以设定放到图形上方
|
|
---|
5.转置 🔗
若要将图形旋转90度后横轴与纵轴互换,即行列互换,亦即转置,最好是按数值排序后展示,或者按照数据项本身的含义排序后展示如人口金字塔图:
#倒序排序
data.3 <- data[order(data$value1, decreasing = FALSE), ]
data.3 %>%
e_chart(area) %>%
e_bar(value1) %>%
e_y_axis(show = FALSE) %>%
e_legend(show = FALSE) %>%
e_flip_coords() %>%
e_labels(position = "right")
#仿人口结构的金字塔图
data.4 <- data.frame(
level = c('0-10岁','11-20岁','21-30岁','31-40岁','41-50岁','51-60岁','61-70岁','71-80岁','80岁以上'),
value1 = sample(1:10, 9),
value2 = sample(1:10, 9),
value3 = sample(1:10, 9),
value4 = sample(1:10, 9)
)
data.4%>%
dplyr::mutate(value3=-value3,value4=-value4)%>%
e_chart(level)%>%
e_bar(value1,stack="grp")%>%
e_bar(value2,stack="grp")%>%
e_bar(value3,stack="grp")%>%
e_bar(value4,stack="grp")%>%
e_y_axis(show = FALSE) %>%
e_legend(show = FALSE) %>%
e_flip_coords()
|
|
---|
6.极坐标(polar) 🔗
echarts4r包还提供了一种画在极坐标系上的条形图,相当于把普通条形图的横轴两端连成一个圆:
data %>%
e_charts(area) %>% #X轴
e_polar() %>%
e_angle_axis(area) %>% # angle = x
e_radius_axis() %>%
e_bar(value1, coord_system = "polar") %>%
e_scatter(value2, coord_system = "polar")
data %>%
e_charts(area) %>%
e_polar() %>%
e_angle_axis() %>%
e_radius_axis(area, axisLabel = list(interval = 0)) %>% #将x轴标签的间隔设为0
e_bar(value1, coord_system = "polar")
|
|
|
---|
7.速查表 🔗
当想要修改图的细节但是不知道对应的函数名字时,也可以先翻翻官方的速查表,然后再去官方文档中搜索对应函数名称。
I.常用组件:
II.图形系列:
III.坐标系&组件: