主頁 > 軟體工程 > 更改李克特包R中每個條的顏色

更改李克特包R中每個條的顏色

2022-10-31 23:04:41 軟體工程

我有這個資料框:

library(likert)
library(ggplot2)

DF<-data.frame(A=c(1,2,3,4,5),B=c(2,3,4,5,1),C=c(3,1,2,4,5),D=c(2,3,4,5,1),E=c(1,2,4,3,5))
categories<-c("A","B","C","D","E")

我將觀察結果轉換為因子,并使用likert包創建了一個 likert 物件:

DF <- DF %>% 
  mutate(across(contains(categories), ~ ordered(., levels = c(1,2,3,4,5),labels = c(1,2,3,4,5))))

likert_data<-likert(DF)

likert.plot現在我使用同一個包中的函式創建下圖:

plot(likert_data,plot.percent.neutral=F,center=3.5)

更改李克特包R中每個條的顏色

我想做的是根據類別(A,B,C,D,E)更改每個條的顏色,所以得到這樣的東西:

更改李克特包R中每個條的顏色

傳說不一定是這樣的。我知道如何更改整個圖形的顏色,但不知道如何更改單個條形的顏色。你有什么建議嗎?謝謝!

uj5u.com熱心網友回復:

根據您的評論,我在最后添加了更多資訊。


原始答案

這使用庫shadesggplotifygridgtablegridExtra

我將首先提供代碼。在那之后,我用解釋把它分解了。

library(likert)
library(tidyverse)
library(shades)    # for colors
library(ggplotify) # change back to ggplot
library(gtable)    
library(grid)
library(gridExtra)

x = plot(likert_data, plot.percent.neutral = F,
         center = 3.5, group = categories) 
x

xx <- plot(likert_data, plot.percent.neutral = F,
          center = 3.5, group = categories)  
  theme(legend.position = "none")         # <------ no legend

y <- ggplotGrob(xx)                         # make it a grid object
filling <- which(grepl("#5AB4AC", y$grobs)) # returned 6, 15

#------------- modify the plot -------------
for(each in y$grobs[[6]]$children) {        # find where fill used
  print(each)
  print(each$gp$fill)
}

# make color gradients for new color gradients
rainbow <- c(gradient(c("darkred", "mistyrose"), 3),
             gradient(c("#FF7F00", "lightgoldenrod"), 3),
             gradient(c("darkgreen", "lightgreen"), 3), 
             gradient(c("darkblue", "lightblue"), 3),
             gradient(c("purple4", "plum"), 3))

# light gray, dark gray
greys = c("gray74", "gray40")

# first pallet has those colors left of the 0 line
# get the light values out of the rainbow of colors
whL <- seq(3, length(rainbow), by = 3)
negs <- c(rev(rainbow[whL]), rep(greys, each = 5))
y$grobs[[6]]$children[[4]]$gp$fill <- negs     # add to the plot

# get the remaining colors out of the rainbow
rainGp <- c(seq(2, length(rainbow), by = 3), seq(1, length(rainbow), by = 3))
rainbow2 <- rainbow[rainGp] # select only those that apply
y$grobs[[6]]$children[[5]]$gp$fill <- rainbow2 # add to the plot

grid::grid.draw(y) # take a look using grid
(xx <- as.ggplot(y)) # or you can look as ggplot object (it's the same)

#------------- create the legend -------------
x2 <- x   scale_fill_manual(values = c(rev(greys), rev(rainbow[1:3])), name = "")
redLeg <- gtable_filter(ggplot_gtable(ggplot_build(x2)), "guide-box")

x3 <- x   scale_fill_manual(values = c(rev(greys), rev(rainbow[4:6])), name = "")
orgLeg <- gtable_filter(ggplot_gtable(ggplot_build(x3)), "guide-box")

x4 <- x   scale_fill_manual(values = c(rev(greys), rev(rainbow[7:9])), name = "")
grnLeg <- gtable_filter(ggplot_gtable(ggplot_build(x4)), "guide-box")

x5 <- x   scale_fill_manual(values = c(rev(greys), rev(rainbow[10:12])), name = "")
bluLeg <- gtable_filter(ggplot_gtable(ggplot_build(x5)), "guide-box")

x6 <- x   scale_fill_manual(values = c(rev(greys), rev(rainbow[13:15])), name = "")
purLeg <- gtable_filter(ggplot_gtable(ggplot_build(x6)), "guide-box")

# get legends' object names
lgs <- grep("Leg", names(.GlobalEnv), value = T) 
# fix order         <------- order may be different you on your computer
lgs <- lgs[c(4, 3, 2, 5, 1)]
lgs <- lapply(lgs, get)          # capture objects instead of strings
legging <- do.call("rbind", lgs) # make this one gtable instead of 5

gb <- textGrob("Response", x = 1, y = .5, just = c("right", "center"))

arr <- arrangeGrob(grobs = list(gb, legging), widths = c(1, 2),
                   ncol = 2, nrow = 1, padding = 0)

#------------ the plot's ready --------------
# new plot object
grid.arrange(xx, arr, heights = c(7, 3), nrow = 2, ncol = 1)

所有這一切:

更改李克特包R中每個條的顏色

除了將李克特圖分配給物件之外,我沒有更改您提供的代碼。

我還創建了另一個沒有圖例的版本。首先,您將使用沒有圖例的情節(以后制作圖例時除外)。

x = plot(likert_data, plot.percent.neutral = F,
         center = 3.5, group = categories) 

xx <- plot(likert_data, plot.percent.neutral = F,
          center = 3.5, group = categories)  
  theme(legend.position = "none")

使用幫助,我發現李克特圖的頂部默認顏色是#5AB4AC,所以我使用該資訊搜索ggplotGrob.

y <- ggplotGrob(xx)
filling <- which(grepl("#5AB4AC", y$grobs)) # returned 6, 15

這將回傳第 6 個 grob 和第 15 個 grob 包含分配給此顏色的內容。首先是劇情。二是傳說。



改變情節

接下來,我進一步研究了圖中的顏色分配。我需要看看背景中的顏色是如何分解的。

for(each in y$grobs[[6]]$children) {
  print(each)
  print(each$gp$fill)
}

for電話中,我發現我需要查看第 6 個 grob 中的第 4 個和第 5 個孩子。

這是從 for 陳述句回傳的內容(截斷僅顯示第 4 個和第 5 個孩子)。

# rect[geom_rect.rect.871] 
# [1] "#F2E5CB" "#F2E5CB" "#F2E5CB" "#F2E5CB" "#F2E5CB" "#E5CC98" "#E5CC98"
# [8] "#E5CC98" "#E5CC98" "#E5CC98" "#D8B365" "#D8B365" "#D8B365" "#D8B365"
# [15] "#D8B365"
# rect[geom_rect.rect.873] 
# [1] "#ACD9D5" "#ACD9D5" "#ACD9D5" "#ACD9D5" "#ACD9D5" "#5AB4AC" "#5AB4AC"
# [8] "#5AB4AC" "#5AB4AC" "#5AB4AC"

你可以看到我提到的顏色只有第5個孩子。您在這里看到的是,第 4 個孩子的這些值位于垂直線左側的 x 軸上為零。第 5 個孩子有兩個最高的反應;垂直零線右側的兩個。

接下來,我創建了一個調色板來替換這些顏色。

rainbow <- c(gradient(c("darkred", "mistyrose"), 3),
             gradient(c("#FF7F00", "lightgoldenrod"), 3),
             gradient(c("darkgreen", "lightgreen"), 3), 
             gradient(c("darkblue", "lightblue"), 3),
             gradient(c("purple4", "plum"), 3))

我嘗試了幾種不同的方法來讓它更加動態,但是顏色強度真的不均勻,所以我手動設定它。

接下來是兩種灰色。

# light gray, dark gray
greys = c("gray74", "gray40")

要重置第四個孩子的顏色,我需要替換李克特回應 1、2 和 3 的顏色。所以我需要從rainbow.

whL <- seq(3, length(rainbow), by = 3)
negs <- c(rev(rainbow[whL]), rep(greys, each = 5))
y$grobs[[6]]$children[[4]]$gp$fill <- negs     # add to the plot

現在是時候更改 4 和 5 的李克特回應了。

# get the remaining colors out of the rainbow
rainGp <- c(seq(2, length(rainbow), by = 3), seq(1, length(rainbow), by = 3))
rainbow2 <- rainbow[rainGp]                    # select only those that apply
y$grobs[[6]]$children[[5]]$gp$fill <- rainbow2 # add to the plot

在這一點上,你的情節的顏色都改變了。

grid::grid.draw(y) # take a look using grid
(xx <- as.ggplot(y)) # or you can look as ggplot object (it's the same)

更改李克特包R中每個條的顏色



改變傳奇

我沒有重新發明輪子,而是為我ggplot創造了傳奇。本質上,我將繪制五次圖表——每個顏色組一次。每次繪制它時,我都會將所有內容都設為一個顏色組。(例如,第一個僅使用紅色陰影。)創建繪圖后,我使用gtable提取圖例。

x2 <- x   scale_fill_manual(values = c(rev(greys), rev(rainbow[1:3])), name = "")
x2
redLeg <- gtable_filter(ggplot_gtable(ggplot_build(x2)), "guide-box")

x3 <- x   scale_fill_manual(values = c(rev(greys), rev(rainbow[4:6])), name = "")
x3
orgLeg <- gtable_filter(ggplot_gtable(ggplot_build(x3)), "guide-box")

x4 <- x   scale_fill_manual(values = c(rev(greys), rev(rainbow[7:9])), name = "")
x4
grnLeg <- gtable_filter(ggplot_gtable(ggplot_build(x4)), "guide-box")

x5 <- x   scale_fill_manual(values = c(rev(greys), rev(rainbow[10:12])), name = "")
x5
bluLeg <- gtable_filter(ggplot_gtable(ggplot_build(x5)), "guide-box")

x6 <- x   scale_fill_manual(values = c(rev(greys), rev(rainbow[13:15])), name = "")
x6
purLeg <- gtable_filter(ggplot_gtable(ggplot_build(x6)), "guide-box")

我本可以將這些圖例中的每一個都添加到串列中,但我只是將它們稱為串列。由于它會搜索環境,因此不知道您將按什么順序將它們放回原處。我已在此處修復了順序,但在您的設備上可能會有所不同。

在收集他們的名字并將它們按順序排列之后,我get將它們(從字串更改為物件),然后將它們系結到一個gtable.

# get legends' object names
lgs <- grep("Leg", names(.GlobalEnv), value = T) 

# fix order         <------- order may be different you on your computer
lgs <- lgs[c(4, 3, 2, 5, 1)]
lgs <- lapply(lgs, get)          # capture objects instead of strings
legging <- do.call("rbind", lgs) # make this one gtable instead of 5

此時您實際上可以使用grid.draw().

現在我已經有了圖例,我將添加圖例標簽“回應”。(我把它取下來是因為每串顏色看起來很奇怪。)

接下來,將合并的圖例和標簽放在一個物件中。

# legend title
gb <- textGrob("Response", x = 1, y = .5, just = c("right", "center"))
# consolidate legend title and legends
arr <- arrangeGrob(grobs = list(gb, legging), widths = c(1, 2),
                   ncol = 2, nrow = 1, padding = 0)

接下來,結合顏色變化的情節和顏色變化的圖例。(你完成了!)

# new plot object
grid.arrange(xx, arr, heights = c(6, 4), nrow = 2, ncol = 1)

您可能需要在heights此處進行調整。它不是相對的,因此根據您的使用方式,您可能需要進行調整。

更改李克特包R中每個條的顏色

基于您的評論的資訊

我創建了一些函式來完成大部分帶有多個約束的繪圖顏色更改作業。

我還沒有對此進行足夠的測驗,無法說明無論資料如何,它的作業效果如何。

這假設您將使用該論點center = 3.5并使用 1-5 的李克特量表。如果您不知道,對于李克特庫,您必須在每個問題中具有相同數量的級別才能繪制。(保留空白級別。)

library(likert)
library(tidyverse)
library(shades)    # for colors
library(ggplotify) # change back to ggplot
library(gtable)    
library(grid)
library(gridExtra)

x = plot(likert_data, plot.percent.neutral = F,
         center = 3.5, group = categories) 
xx <- plot(likert_data, plot.percent.neutral = F,
           center = 3.5, group = categories)  
  theme(legend.position = "none")         # <------ no legend

y <- ggplotGrob(xx)                         # make it a grid object
filling <- which(grepl("#5AB4AC", y$grobs)) # returned 6 (ran without legend)

#-------------- modify the plot ----------------
# this assumes that you have used the parameter center = 3.5 in Likert plot
# this works for 1-5 Likert questions (rows in the plot)
# assumes only 5 levels of Likert
# assumes there is at least 1 neg & 1 pos in each row!

defaultNeg = c("1" = "#D8B365", "2" = "#E5CC98", "3" = "#F2E5CB")
defaultPos = c("4" = "#ACD9D5", "5" = "#5AB4AC")

# make color gradients for new color gradients
grays = c("gray74", "gray40")     # light gray, dark gray
rainbow <- c(gradient(c("darkred", "mistyrose"), 3),
             gradient(c("#FF7F00", "lightgoldenrod"), 3),
             gradient(c("darkgreen", "lightgreen"), 3), 
             gradient(c("darkblue", "lightblue"), 3),
             gradient(c("purple4", "plum"), 3))

# this function is called with collector()
getY <- function(grob_sub, w, freq) {
  # grob_sub, w: (wGrob) index of affected child; 
  #    freq: number to filter for
  wh <- table(grob_sub[[w]]$y %>% as.numeric()) %>% 
    as.data.frame() %>% mutate(id = 1:nrow(.)) %>% 
    filter(Freq < freq) %>% select(id) %>% unlist()
  return(wh)
}

# this function is called within replaceFill()
collector <- function(grob_sub, what) { # what: either defaultNeg or defaultPos
  idsL <- seq(length(rainbow), 3, by = -3) # set up for light & dark color extract
  idsD <- c(seq(2, length(rainbow), by = 3), seq(1, length(rainbow), by = 3))
  i = 0
  for(each in grob_sub) {        # find where fill used in children
    i = i   1
    if(is.null(each$gp$fill)) {next} # not it
    else {
      fills = each$gp$fill
      if(length(fills) < 2) {next}   # not it
      if(any(fills %in% what)) {
        wGrob = i       # if contains the colors
        break           # no reason to keep looking
      }
    }
  }
  wCol <- grob_sub[[wGrob]]$gp$fill       # get colors
# if there is a missing level
  if(isTRUE(any(length(wCol)/5 != 10 & any(length(wCol)/5 != 15)))) {
    # rule out the grey values (if they're missing no special handling needed)
    tb <- table(wCol) %>% as.data.frame()
    if(nrow(tb %>% filter(wCol == defaultNeg[3], Freq == 5)) > 0) {
      break # move on, the item missing is a gray entry
    } 
    if(nrow(tb %>% filter(wCol == defaultNeg[3], Freq < 5)) > 0) {
      wh <- getY(grob_sub, wGrob, 3) # if light colors, there's 3 in each row
      idsL <- idsL[-wh]
      wCol[wCol == defaultNeg[3]] <- rainbow[idsL]
    } 
    if(nrow(tb %>% filter(wCol %in% defaultPos, Freq < 5)) > 0) {
      ins <- outs <- FALSE    # is it an inner or outer color (or both)?
      if(tb[1, "Freq"] < 5) {outs <- TRUE}
      if(tb[2, "Freq"] < 5) {ins <- TRUE}
      wh <- getY(grob_sub, wGrob, 2) # regardless of path are there three in each row?
      if(isTRUE(all(ins, outs))) { # this is not handled at this time  
        message("Handling not added for multiple positive missing levels.")
      } else if(isTRUE(ins)) {
        idsD <- idsD[-wh]
        wCol[wCol == defaultPos[1] | wCol == defaultPos[2]] <- rainbow[idsD]
      } else if(isTRUE(outs)) {
        idsD <- idsD[-wh]
        wCol[wCol == defaultPos[1] | wCol == defaultPos[2]] <- rainbow[idsD]
      }
    }
  }
  else {                         # there are no missing levels starts here
    if(defaultNeg[3] %in% wCol){ # if this one element is in the vector
      wCol[wCol == defaultNeg[3]] <- rainbow[idsL] # change light colors
    } else if(any(defaultPos %in% wCol)) {
      wCol[wCol == defaultPos[1] | wCol == defaultPos[2]] <- rainbow[idsD]
    }
  } # regardless if something is missing, gray values are the same
  if(any(wCol %in% defaultNeg[1:2])) {
    wCol <- gsub(defaultNeg[1], grays[2], wCol)
    wCol <- gsub(defaultNeg[2], grays[1], wCol)
  }
  return(list(wCol, wGrob))      # return colors and child indices
}

# grob_sub at plot level here this is  y$grobs[[6]]$children
replaceFill <- function(grob_sub) { 
  negs <- collector(grob_sub, defaultNeg) # call for positives
  poss <- collector(grob_sub, defaultPos) # call for negatives
  return(list(negs, poss))
}

#--------------- make the legend & combine the plot -------------
makeLegends <- function(xx, x, rainbow) { 
  # xx is the plot with the fixed colors and no legend
  # x is a plot with a legend
  # rainbow 15 color array/vector will all of the non-gray colors
  # ---
  # create sequences for each part of the rainbow
  cols <- c("red", "orange", "green", "blue", "purple")
  i = 1
  lgs = list()
  for(each in cols) {
    newX <- x   
      scale_fill_manual(values = c(rev(grays), rev(rainbow[i:(i   2)])), name = "")
    lgs[[each]] <- gtable_filter(ggplot_gtable(ggplot_build(newX)), "guide-box")
    i = i   3
  }
  legging <- do.call("rbind", lgs) # combine legends into one legend
  # create legend title grob
  tg <- textGrob("Response", x = 1, y = .5, just = c("right", "center"))
  # assemble legends with legend title
  arr <- arrangeGrob(grobs = list(tg, legging), widths = c(1, 2),
                     ncol = 2, nrow = 1, padding = 0)
  result <- grid.arrange(xx, arr, heights = c(7, 3), nrow = 2, ncol = 1)
  result
}

要使用這些功能,這是您需要做的。我添加了一個修改過的資料框來顯示當有空級別時會發生什么。

DF <- rbind(DF, DF) %>% mutate(B = ifelse(B == 3, 4, B),
                               C = ifelse(C == 4, 5, C)) %>%
  mutate(across(contains(categories),
                ~ordered(., levels = c(1, 2, 3, 4, 5),
                         labels = c(1, 2, 3, 4, 5))))

# call the function to get the colors and ids
np <- replaceFill(y$grobs[[6]]$children)

# change the colors with the ids
y$grobs[[6]]$children[[np[[1]][[2]]]]$gp$fill <- np[[1]][[1]]
y$grobs[[6]]$children[[np[[2]][[2]]]]$gp$fill <- np[[2]][[1]]

#------------------------------ plot color finished 
grid::grid.draw(y)   # take a look using grid
(xx <- as.ggplot(y)) # or you can look as ggplot object (it's the same)

#------------ see the finished plot  --------------
plt <- makeLegends(xx, x, rainbow) # create the finished plot
grid.newpage()
grid.draw(plt)

使用這些函式的修改后的資料產生了這個圖。

更改李克特包R中每個條的顏色

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/523487.html

標籤:r数据框ggplot2阴谋条形图

上一篇:如何在ggplot2中將標簽移到填充條形圖之外

下一篇:Segment/Pointggplot2正在反轉x和y軸

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more