无需 Excel 即可创建甘特图(R & Lease Renewal 特辑)

仅从文字上记录《住宅租赁法》中规定的续订和终止日期并非易事。 您可以使用 Excel 中的甘特图,但还有一种更简单的方法。只需复制并粘贴甘特图的源代码并运行即可。

在本篇文章中,我们将了解如何使用 R 来可视化租约续订和终止时间表。 在 2021 年 2 月 3 日签订了为期两年的租约后,该公司将于 隐性展期我们还为房东和租户各自发出不续租通知的时间创建了一个可视化表述,以便您清楚地了解重要日期。

간트차트 엑셀없이 만드는 R 시각화 그림
(使用 R 创建甘特图的结果)

无需 Excel 即可创建甘特图

以下是您希望看到的租赁时间表

  • 2021 年 2 月 3 日:合同开始
  • 2023 年 2 月 2 日:合同结束
  • 2022 年 8 月 3 日至 2022 年 12 月 2 日:房东/租户必须发出不续租通知的时间
  • 2023 年 5 月 1 日:默示续约后的租户终止通知
  • 2023 年 8 月 1 日:合同终止,保证金退还

如果您在 2021 年 2 月 3 日签订了为期 2 年的全球租约,如果您有法律认可的理由,房东可以在租约到期日(2023 年 2 月 2 日)前终止您的租约。 6 个月2022 年 8 月 3 日或之前,合同结束日期 2 个月如果房东和租户因个人原因需要搬迁,必须在 2022 年 12 月 2 日至租约期满前发出不续租通知。 2 个月您可在 2022 年 12 月 2 日前发出不续约通知。

在这种情况下,假设默示续约将世界范围内的租期再延长两年,如果租户在 2023 年 5 月 1 日发出退租通知,房东就必须在 2023 年 8 月 1 日,即收到通知的三个月后退还押金。

现在,让我们用 R 将这个复杂的时间表可视化。

无需 Excel 即可创建甘特图的 R 代码说明

首先,安装并加载所需的软件包。

如果 (!require(ggplot2)) install.packages("ggplot2")
if (!require(dplyr)) install.packages("dplyr")
library(ggplot2)
library(dplyr)

创建数据框

为要可视化的数据创建一个数据框。 为每个时间段以及开始和结束日期创建一个数据框。

df <- data.frame(
  Task = c("Initial Contract Term", "Landlord Notice Period", "Tenant Notice Period"、
           "续约合同期限"、"通知后 3 个月")、
  Start = as.Date(c("2021-02-03", "2022-08-03", "2022-08-03"、
                    "2023-02-03", "2023-05-01"))),
  End = as.Date(c("2023-02-02", "2022-12-02", "2022-12-02"、
                  "2025-02-02", "2023-07-30"))),
  Section = c("初始合同"、"不续约通知"、"不续约通知"、"续约合同"、"不续约通知")
              "续订合同"、"合同终止")
)

创建重要日期数据框

创建一个包含重要日期的数据框。上面创建的数据框是用于框架目的,其中的日期是您在图表中显示虚线和日期标签所需要的。

important_dates <- as.Date(c("2021-02-03", "2023-02-02", "2022-08-03", "2022-12-02"、
                             "2023-01-02", "2023-02-03", "2025-02-02",
                             "2023-05-01", "2023-08-01")))
important_dates <- sort(important_dates)

改进日期标签重新定位功能

定义一个函数来重新定位日期标签,使它们不会相互重叠。这是最棘手的部分,因为如果我们要显示的日期标签靠得太近,它们就会重叠,难以看清,所以我们要实现一个函数,检查相距 7 天以内的日期,并将它们上下分开。

adjust_label_position <- function(dates) {
  n <- length(dates)
  positions <- rep(0, n)
  last_position <- 0
  for (i in 2:n) {
    if (as.numeric(dates[i] - dates[i-1]) <= 7) { # 检查 7 天内最近的日期
      positions[i] <- (last_position + 1) %% 2 # 根据前一个位置交替上下移动
      last_position <- positions[i]
    } else {
      last_position <- 0
    }
  }
  return(positions)
}

调整日期标签位置

使用上面定义的功能调整日期标签位置。

label_positions <- adjust_label_position(important_dates)

创建日期标签数据框

创建一个带有标签位置的数据框。

date_labels <- data.frame(
  x = important_dates、
  y = length(df$Task) + 1、
  label = format(important_dates, "%Y-%m-%d")、
  位置 = label_positions
)

创建和输出绘图(图表)

使用 ggplot2 生成图表。

p <- ggplot() +
  geom_segment(data = df, aes(x = Start, xend = End, y = Task, yend = Task, color = Section), size = 8) +
  geom_vline(xintercept = important_dates, linetype = "dashed", color = "darkgray") +
  geom_text(data = date_labels、
            aes(x = x, y = y + ifelse(position == 0, -0.5, 0.5), label = label)、
            angle = 90, hjust = ifelse(date_labels$position == 0, 1, 0), vjust = 0.5, size = 3) +
  scale_x_date(date_labels = "%YYear %mmonth", date_breaks = "3 months") +
  scale_y_discrete(limits = c(df$Task, "", "")) +
  theme_minimal() +
  labs(title = "租约续订和终止时间表(示例)"、
       x = "日期", y = "") +
  theme(legend.position = "bottom"、
        plot.title = element_text(hjust = 0.5, size = 16)、
        axis.text.x = element_text(angle = 45, hjust = 1)、
        panel.grid.minor = element_blank())

打印(p)

保存为 PNG 格式

将生成的绘图保存为 PNG 文件。

ggsave("lease_renewal_process_with_alternating_labels.png", plot = p, width = 15, height = 10, dpi = 300)

完整源代码

下面是上述完整的源代码。将其粘贴并运行,即可看到本帖顶部的图片。

# 필요한 패키지 설치 및 로드
if (!require(ggplot2)) install.packages("ggplot2")  # ggplot2 패키지가 없으면 설치
if (!require(dplyr)) install.packages("dplyr")      # dplyr 패키지가 없으면 설치
library(ggplot2)  # ggplot2 패키지 로드 (그래프 생성용)
library(dplyr)    # dplyr 패키지 로드 (데이터 조작용)

# 데이터 프레임 생성
df <- data.frame(
    Task = c("초기 계약 기간", "집주인 통지 가능 기간", "세입자 통지 가능 기간","갱신 계약 기간", "통보 후 3개월"),  # 각 기간의 이름
    Start = as.Date(c("2021-02-03", "2022-08-03", "2022-08-03","2023-02-03", "2023-05-01")),  # 각 기간의 시작일
    End = as.Date(c("2023-02-02", "2022-12-02", "2022-12-02","2025-02-02", "2023-07-30")),    # 각 기간의 종료일
    Section = c("초기 계약", "갱신 거절 통지", "갱신 거절 통지","갱신 계약", "계약 해지")  # 각 기간의 분류
)

# 중요한 날짜 데이터 프레임 생성
important_dates <- as.Date(c("2021-02-03", "2023-02-02", "2022-08-03", "2022-12-02",
                             "2023-01-02", "2023-02-03", "2025-02-02",
                             "2023-05-01", "2023-08-01"))  # 중요한 날짜들을 벡터로 정의
important_dates <- sort(important_dates)  # 날짜를 오름차순으로 정렬

# 날짜 레이블 위치 조정 함수 개선
adjust_label_position <- function(dates) {
    n <- length(dates)
    positions <- rep(0, n)  # 모든 위치를 0으로 초기화
    last_position <- 0
    for (i in 2:n) {
        if (as.numeric(dates[i] - dates[i-1]) <= 7) {  # 7일 이내의 근접한 날짜 확인
            positions[i] <- (last_position + 1) %% 2     # 이전 위치에 따라 상하 교대 (0 또는 1)
            last_position <- positions[i]
        } else {
            last_position <- 0
        }
    }
    return(positions)
}

# 날짜 레이블 위치 조정
label_positions <- adjust_label_position(important_dates)

# 날짜 레이블 데이터 프레임 생성
date_labels <- data.frame(
    x = important_dates,  # x축 위치 (날짜)
    y = length(df$Task) + 1,  # y축 위치 (모든 Task 위에 위치)
    label = format(important_dates, "%Y-%m-%d"),  # 레이블 텍스트 (날짜 형식)
    position = label_positions  # 레이블의 상하 위치 (0 또는 1)
)

# 플롯 생성
p <- ggplot() +
    geom_segment(data = df, aes(x = Start, xend = End, y = Task, yend = Task, color = Section), size = 8) +
    # 각 Task에 대한 기간을 나타내는 선분. x: 시작일, xend: 종료일, y: Task 이름, color: Section으로 색상 구분
    
    geom_vline(xintercept = important_dates, linetype = "dashed", color = "darkgray") +
    # 중요한 날짜에 수직선 추가. linetype: 점선, color: 진한 회색
    
    geom_text(data = date_labels,
              aes(x = x, y = y + ifelse(position == 0, -0.5, 0.5), label = label),
              angle = 90, hjust = ifelse(date_labels$position == 0, 1, 0), vjust = 0.5, size = 3) +
    # 날짜 레이블 추가. x: 날짜 위치, y: Task 위 또는 아래, label: 날짜 텍스트
    # angle: 90도 회전, hjust & vjust: 레이블 정렬, size: 글자 크기
    
    scale_x_date(date_labels = "%Y년 %m월", date_breaks = "3 months") +
    # x축 날짜 형식 설정. date_labels: 년월 표시 형식, date_breaks: 3개월 간격으로 눈금 표시
    
    scale_y_discrete(limits = c(df$Task, "", "")) +
    # y축 설정. limits: Task 이름들과 추가 여백 설정
    
    theme_minimal() +  # 최소한의 테마 적용
    labs(title = "임대차 계약 갱신 및 해지 스케쥴 (예시)",
         x = "날짜", y = "") +  # 그래프 제목, x축 레이블 설정
    theme(legend.position = "bottom",  # 범례 위치를 아래로 설정
          plot.title = element_text(hjust = 0.5, size = 16),  # 제목 중앙 정렬 및 크기 설정
          axis.text.x = element_text(angle = 45, hjust = 1),  # x축 레이블 45도 회전
          panel.grid.minor = element_blank())  # 작은 격자선 제거

# 플롯 출력
print(p)

# PNG 형식으로 저장
ggsave("lease_renewal_process_with_alternating_labels.png", plot = p, width = 15, height = 10, dpi = 300)
# 파일명, 플롯 객체, 너비, 높이, 해상도 설정

组织起来

在这篇文章中,我们学习了如何使用 R 来可视化租约续签和终止时间表。 将复杂的合同时间表表示为可视化时间表表,可以让重要日期一目了然。

首先,我安装了必要的软件包,准备了数据,并编写了一个调整日期标签的函数,使它们不会重叠。 然后,我解释了使用 ggplot2 创建租赁期限和重要日期的可视化图,并将其保存为 PNG 文件的过程。

这种可视化技术不仅对租赁协议很有帮助,对各种日程安排和项目规划也很有帮助。在继续探索不同的数据可视化技术时,请练习清晰地表达数据的含义。此外,我们希望你能通过可视化数据培养做出更好决策的能力。

类似文章