R语言 使用ggplot(或只是plot)在多线图中跟踪房价随时间的升值

pgx2nnw8  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(83)

这几天我一直想弄明白但毫无结果
我试图证明,自20世纪90年代以来,沿着某个特定海岸的50多栋房屋已经升值。我必须处理的数据是不完整的,因为从1983年到2023年,每栋房子只卖了2-5次。
我做了一个电子表格,其中的列是年(1983,1984,1985,1986等等),行是特定的属性。我想制作一个多线图,每一线代表一个属性。我知道这看起来会有点混乱,因为每个物业没有那么多的数据点(如,倍,它被出售),但事实上,他们都升值应该是清楚的。
我希望x轴是年份,y轴是它们的售价。每一行都应该是一个属性。
我一直在搜索论坛,但我不知所措
任何帮助都将不胜感激:>
我试过gggplot,但很快就卡住了。我不知道如何定义x=,因为我希望x轴是所有的列(因为我的.csv文件中的每一列都是一年)。
我也试过手动操作。当我这样做的时候,我得到了我想要的东西的一个小版本,但有假的数字和年份:

x  <- c(1990,2000,2005,2010, 2015,2020) #FAKE YEARS 
y1 <- c(NA,101,105,367, NA, NA) #FAKE PRICES. , y1 is one house. 
y2 <- c(1000, 568, 6237, 87, NA, NA) #FAKE PRICES HOUSE TWO, SIMPLY WRITE NA FOR MISSING VALUES
y3 <- c(3,6,12,14,17,15)
plot(x, y1, type="o", col = "blue", pch="o", ylab="y", lty=10)
points(x, y2, col="red", pch="o")
lines(x, y3, col="green", lty=2)

但是当我尝试输入我的实际数据时,虚线消失了,我只得到了图形上的点:

years <- c(1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023)
xx <- c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 330000, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 599000, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)
xxx <- c(NA,    NA, NA, NA, NA, NA, NA, NA, 325000, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 621000, NA, NA, NA, NA, NA, 704000, NA, NA, NA, 100000000,  NA, NA, NA, 100000000, NA,  NA)

plot(years, xx, type="o", col = "blue", pch="o", ylab="y",lty="solid")

points(years, xxx, col="red", pch="o")
lines(years, xxx, col="green", lty=2)


我附上了我的电子表格的图片,但它只是其中的一角。实际的电子表格有57行和40列(直到2023年)。
如果有一种方法可以用ggplot 2来实现,那就太好了,但是如果我不得不使用向量手动键入我的电子表格,那也是可以的

cyvaqqii

cyvaqqii1#

您应该将数据放入数据框中,以便使用ggplot进行绘图。将数据透视为长格式也很有用,这意味着对数据框进行格式化,以便您有一个用于年份的列,一个用于行引用的房屋标签的列,以及一个用于房屋价格的列。使用这种格式的数据可以更轻松地进行处理和绘图,并且使用tidyr::pivot_longer非常简单
然而,您的主要问题是,如果您正在绘制线图,则线在有NA值的地方断开。任何被NA值包围的年份都没有任何可连接的东西,因此在图中完全缺失。为了解决这个问题,你可以对缺失的值执行 * 线性插值 *。函数pracma::interp1可以为您做到这一点。
拥有这种格式的数据将使创建具有大量选项的ggplot变得容易,以完全自定义图形的外观。
这是一个完全可重复的例子。为了清楚起见,我对你的例子做了一些修改,因为xxx的最后几个值完全使图的其余部分相形见绌。如果这些是真的,你可能想考虑对数y轴。

years <- (1983:2023)[-20]
xx <- c(NA, NA, NA, NA, NA, NA, NA, NA, NA, 330000, NA, NA, NA, NA, NA, NA,
        NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 599000, NA, NA, 
        NA, NA, NA, NA, NA, NA, NA, NA)
xxx <- c(NA,    NA, NA, NA, NA, NA, NA, NA, 325000, NA, NA, NA, NA, NA, NA, 
         NA, NA, NA, NA, NA, NA, NA, NA, 621000, NA, NA, NA, NA, NA, 704000, 
         NA, NA, NA, 1000000,  NA, NA, NA, 1000000, NA,  NA)

library(tidyverse)

data.frame(years, xx, xxx) %>% 
  pivot_longer(-years) %>%
  mutate(is_real = !is.na(value)) %>%
  group_by(name) %>%
  mutate(value = pracma::interp1(years, value, years, "linear")) %>%
  ggplot(aes(years, value, colour = name)) +
  geom_line(na.rm = TRUE, linewidth = 2, alpha = 0.3) +
  geom_point(data = . %>% filter(is_real), na.rm = TRUE, size = 4) +
  scale_color_manual("House", values = c("deepskyblue4", "orange")) +
  scale_y_continuous(labels = scales::dollar) +
  theme_minimal(base_size = 16)

字符串
x1c 0d1x的数据
如果我们使用问题中发布的数据,我们可以使用对数标度来避免在较低的值中丢失细节。为此,我们将scale_y_continuous调用更改为

scale_y_continuous(labels = scales::dollar, trans = "log10")


导致


创建于2023-07-19与reprex v2.0.2

相关问题