Создавайте иконки из стандартного барплота (или ggplot2 geom_col) с одним бар - PullRequest
0 голосов
/ 09 июля 2019

Я хочу создать иконки png с одной полосой (из стандартного barplot или ggplot2 geom_col). Иконки будут представлены на листовой карте. Есть data.frame: lat, lon, val. Параметр «val» используется для установки высоты полосы (только одна полоса на одной иконке). Значки должны иметь одинаковый размер, столбцы должны иметь одинаковую ширину, каждый столбец с надписью выше (val). Высота стержня ограничена максимальным значением (высота значка).

Пример изображения - карта с иконами для реконструкции

Пример кода приведен ниже. Я использовал подсказки отсюда: R Барплот с одним стержнем - как правильно построить

Результат с моим кодом - все имеют одинаковую высоту

lats = c(69.5, 70.0, 69.0) 
lons = c(33.0,33.5,34.3) 
vals = c(7,19,5) 
df = data.frame(lats, lons, vals)

for (i in 1:3) {
      png(file=paste0(i,".png"), width=100, height=200, res=72)
      bp <- barplot(df$vals[i], height =df$vals[i],
                    width=0.2, xlim=c(0,1.2), col="brown4", axes=FALSE);
      text(bp, 10*df$vals[i]+10, labels=df$vals[i]);
      dev.off()
}

1 Ответ

0 голосов
/ 10 июля 2019

Я использовал совет @Axeman и провел несколько экспериментов с параметрами png / barplot. Проблема решена. Результат выглядит следующим образом.

library(shiny)
library(leaflet)

ui <- fluidPage(leafletOutput("map"))

myicon=function(condition){
  makeIcon(
    iconUrl = paste0(condition,".png"),
    iconWidth = 30, iconHeight = 80
  )}

server <- function(input, output, session) {

  lats = c(69.5, 70.0, 69.0) 
  lons = c(33.0,33.5,34.3) 
  vals = c(7,12,5) 
  df = data.frame(lats, lons, vals)
  for (i in 1:nrow(df)) {
    png(file=paste0(i,".png"), bg="transparent",width=3, height=10, units="in", res=72)
    bp <- barplot(df$vals[i], height =10*df$vals[i],
                  width=1, ylim=c(0,max(10*df$vals)+30),col="brown4", axes=FALSE);
    text(bp,10*df$vals[i]+20,labels=df$vals[i],cex=10,font=2);
    dev.off()
  }

  output$map <- renderLeaflet({
    top=70.4;
    bottom=66.05;
    right=42.05;
    left=27.5;
    leaflet(data = df,
            options = leafletOptions(minZoom = 3,maxZoom = 10))%>%
      fitBounds(right,bottom,left,top)%>%
      addTiles()%>%
      addProviderTiles("Esri.OceanBasemap") %>%
      addMarkers(
        icon = myicon(index(df)),
        lng = lons, lat = lats,
        options = markerOptions(draggable = TRUE))
  })
}

shinyApp(ui, server)
...