我发现"使用开源工具进行数据分析"一书中的排序图表(也称为Pareto图表)非常有用.所以我试着用ggplot2绘制书中的例子.
书中给出了下图,注意坐标被翻转,使得国家的名称显示在Y轴上,更具可读性.虚线是数据的CDF(累积分布函数).
(来源:使用开源工具进行数据分析)
要制作部分模拟数据:
country = c('US', 'Brazil', 'Japan', 'India', 'Germany', 'UK', 'Russia', 'France')
sales = c(40, 14, 7, 6, 2.8, 2, 1.8, 1)
# The data is already sorted
df = data.table(country=country, sales=sales)
Run Code Online (Sandbox Code Playgroud)
然后我用stat_ecdfggplot2来绘制CDF:
ggplot(data=df) + stat_ecdf(aes(x=sales))
Run Code Online (Sandbox Code Playgroud)
但这个数字看起来像:

X轴显示销售量但不显示国家/地区.
我发现了另一种实现方式在这里.但它是通过折线图和明确的累积和实现的,这看起来与书中的例子完全不同.
是否有方法将帕累托图绘制为第一个数字?
我对虚线的内涵犯了一个错误.它不是CDF,而是累积比例.
在一个CDF,它的值映射到其百分等级,的百分等级US为100但秩顺序图表中,所述percentage的US是约45%,这表明在销售US占用总销售额的45%.
因此,我不应该使用stat_ecdf绘制排序图表.
有没有办法用geom_line绘制geom_bar,如下图所示.
我想出了两个独立的图表.如何将它们分别与左右两侧的两个不同轴组合.
library(ggplot2)
temp = data.frame(Product=as.factor(c("A","B","C")),
N = c(17100,17533,6756),
n = c(5,13,11),
rate = c(0.0003,0.0007,0.0016),
labels = c(".03%",".07%",".16%"))
p1 = ggplot(data = temp, aes(x=Product,y=N))+
geom_bar(stat="identity",fill="#F8766D")+geom_text(aes(label=n,col="red",vjust=-0.5))+
theme(legend.position="none",axis.title.y=element_blank(),axis.text.x = element_text(angle = 90, hjust = 1))
p1
p2 = ggplot(data = temp,aes(x=Product,y=rate))+
geom_line(aes(group=1))+geom_text(aes(label=labels,col="red",vjust=0))+
theme(legend.position="none",axis.title.y=element_blank(),
axis.text.x = element_text(angle = 90, hjust = 0))+
xlab("Product")
p2
Run Code Online (Sandbox Code Playgroud)
非常感谢.
我有一些来自实验的蒸腾数据,我希望在使用R的线图上显示时间序列.我也有一些降水数据,我想在条形图上显示在同一图表上.我已经能够使用R的基本程序来做到这一点,但我想在ggplot中这样做.我到处搜索,我知道设计师不太喜欢用这种方式制作图形所以它很难,但我已经看到它使用两个y轴完成了多个线图/散点图.它可以用折线图和条形图完成吗?
这是我用来制作情节的数据
以下是上图的代码.
attach(summary)
library(Hmisc)
library(scales)
par(mar=c(6.5,4,4,5)+.1)
plot(summary$dates,summary$c_mean_am,type="n",ylim=c(100,350),
main="Stomatal Conductance during experiment",las=1,cex.main=1,
font.lab=2,font.axis=2,cex.axis=0.7,cex.lab=0.8,
ylab=expression('Stomatal conductance'~(m~mol~ m^{2})),,xlab="Date")
lines(dates,c_mean_am,pch=21,cex=0.6,bg="blue",col="blue")
lines(dates,T1_mean_am,pch=21,cex=0.6,bg="yellow",col="yellow")
lines(dates,T2_mean_am,pch=21,cex=0.6,bg="hotpink1",col="hotpink1")
lines(dates,T3_mean_am,pch=21,cex=0.6,bg="orange",col="orange")
lines(dates,T4_mean_am,pch=21,cex=0.6,bg="red",col="red")
with (data = summary , expr = errbar(dates, c_mean_am,
c_mean_am+c_se_am,
c_mean_am-c_se_am,
add=T, pch=21,col="blue",bg="blue",
cex=0.6,cap=0.01,errbar.col="blue"))
with (data = summary , expr = errbar(dates, T1_mean_am,
T1_mean_am+T1_se_am,
T1_mean_am-T1_se_am, add=T,
pch=21,col="yellow",bg="yellow",
cex=0.6,cap=0.01,errbar.col="yellow"))
with (data = summary , expr = errbar(dates, T2_mean_am,
T2_mean_am+T2_se_am,
T2_mean_am-T2_se_am,
add=T, pch=21,col="hotpink1",
bg="hotpink1",cex=0.6,cap=0.01,
errbar.col="hotpink1"))
with (data = summary , expr = errbar(dates, T3_mean_am,
T3_mean_am+T3_se_am,
T3_mean_am-T3_se_am,
add=T, pch=21,col="orange", …Run Code Online (Sandbox Code Playgroud) 在R中,ecdf我可以绘制经验累积分布函数
plot(ecdf(mydata))
Run Code Online (Sandbox Code Playgroud)
并且hist我可以绘制我的数据的直方图
hist(mydata)
Run Code Online (Sandbox Code Playgroud)
如何在同一个图中绘制直方图和ecdf?
我尝试做出类似的东西
我正在尝试创建一个气候图,其中温度为线条,降水为条形图。由于每月气温低于零,降水量条(从零开始)很高。
\n\n我希望它们处于温度曲线的最低水平(第一个 y 轴上的 -25 左右),第二个 y 轴此时显示 0。有没有办法移动数据以适应?
\n\n#build data frame with temperature and precipitation data\ndf <- as.data.frame(c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"))\ncolnames(df) <- c("month")\ndf$month <- factor(df$month, levels = month.abb)\ndf$celsius <- c(-26.0, -24.5, -18.9, -9.8, -1.0, 7.0, 12.7, 12.3, 6.4, -1.2, -12.7, -21.9)\ndf$prec_mm <- c(18.7, 16.6, 18.1, 23.6, 30.0, 44.2, 59.8, 69.4, 69.9, 48.4, 35.5, 18.4)\n\n#plot with ggplot2\nlibrary(ggplot2)\n\nggplot(data = df, mapping = aes(x = month, y = celsius, group = 1)) …Run Code Online (Sandbox Code Playgroud) 对于出版物,我需要在现有图中添加第二个y轴.我遇到过如何做到这一点的方法(https://rpubs.com/kohske/dual_axis_in_ggplot2).但是,我并不太了解编码.我找不到一种方法来使它成为正确的y轴也显示,而不是顶部边框.我的编码中缺少什么?这是我的虚拟数据:
df1 <- structure(list(month = structure(1:12, .Label = c("Apr", "Aug",
"Dec", "Feb", "Jan", "Jul", "Jun", "Mar", "May", "Nov", "Oct",
"Sep"), class = "factor"), RI = c(0.52, 0.115, 0.636666666666667,
0.807, 0.66625, 0.34, 0.143333333333333, 0.58375, 0.173333333333333,
0.5, 0.13, 0), sd = c(0.327566787083184, 0.162634559672906, 0.299555225848813,
0.172887246493199, 0.293010848165827, 0.480832611206852, 0.222785397486759,
0.381610777775321, 0.219393102292058, 0.3, 0.183847763108502,
0)), .Names = c("month", "RI", "sd"), class = "data.frame", row.names = c(NA,
-12L))
df2<-structure(list(month = structure(c(5L, 4L, 8L, 1L, 9L, 7L, 6L,
2L, 12L, 11L, 10L, 3L), .Label …Run Code Online (Sandbox Code Playgroud) 我正在尝试在以下代码中添加辅助轴的图例
library(ggplot2)
library(dplyr)
library(reshape2)
df = data.frame(period = seq(as.POSIXct("2017-01-01"),as.POSIXct("2017-12-01"), by = "month"),
b = c(100, 110, 105, 200, 210, 190, 180, 170, 165, 175, 140, 145),
c = c(120, 130, 150, 170, 250, 160, 130, 120, 110, 130, 120, 170),
d = c(1060, 1180, 1050, 2070, 2150, 1900, 1850, 1070, 1605, 1750, 1460, 1250)) %>%
mutate(period = factor(period))
df_bar = melt(df, id.vars = "period", measure.vars = c("b", "c", "d")) %>% filter(variable != "d")
df_line = df %>% select(period, d)
ggplot(data …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个ggplot2图形,该图形显示相互重叠的条形图和折线图。在excel中,这可以通过添加第二个轴来完成。
x轴表示产品类型,条形图的y值应表示收入,而我想将利润率表示为百分比的折线图。折线图和条形图的值应彼此独立,即不存在这种关系。
require(ggplot2)
df <- data.frame(x = c(1:5), y = abs(rnorm(5)*100))
df$y2 <- abs(rnorm(5))
ggplot(df, mapping= aes(x=as.factor(`x`), y = `y`)) +
geom_col(aes(x=as.factor(`x`), y = `y`),fill = 'blue')+
geom_line(mapping= aes(x=as.factor(`x`), y = `y`),group=1) +
geom_label(aes(label= round(y2,2))) +
scale_y_continuous() +
theme_bw() +
theme(axis.text.x = element_text(angle = 20,hjust=1))
Run Code Online (Sandbox Code Playgroud)
上面的图像几乎产生了我想要的。但是,缩放比例不正确-我需要按幅度对1.38和0.23值进行排序,即0.23点应显示在1.38以下。我也不确定如何在右侧添加另一个轴。
数据链接:
码:
distevyield <- read.csv(file = "F:/Purdue University/RA_Position/PhD_ResearchandDissert/PhD_Draft/GTAP-CGE/GTAP_NewAggDatabase/NewFiles/GTAP_DistEVYield.csv", header=TRUE, sep=",", na.string="NA", dec=".", strip.white=TRUE)
str(distevyield)
distevyield <- as.data.frame(distevyield)
distevyield[5:6] <- sapply(distevyield[5:6],as.numeric)
distevyield <- droplevels(distevyield)
distevyield <- transform(distevyield,region=factor(region,levels=unique(region)))
library(ggplot2)
distevyield.f <- melt(subset(distevyield, region !="World"))
Figure3 <- ggplot(data = distevyield.f, aes(factor(variable), value))
Figure3 + geom_boxplot() +
theme(axis.text.x = element_text(colour = 'black', angle = 90, size = 15, hjust = 1, vjust = 0.5),axis.title.x = element_blank()) +
theme(axis.text.y = element_text(colour = 'black', size = 15, hjust = 0.5, vjust = 0.5), axis.title.y = …Run Code Online (Sandbox Code Playgroud) 我希望缩放y轴:
通过log10,我用过:
scale_y_log10(breaks = trans_breaks("log10",function(x)10 ^ x))
更多刻度:
scale_y_continuous(断裂= pretty_breaks(10))
但是从错误消息中,只能有一个比例.有没有办法同时拥有这两个尺度?
我有两个共享公共 x 值的数据集(可以合并为一个),而 y 值不同 - 我想在一个数据集中绘制 y 值并将 y 轴放在图的左侧,而绘制另一个数据集中的 y 值,并将 y 轴放在同一图的右侧。当然,两个y轴值的相对比例是不同的(实际上应该根据第一个数据集中的y值“调整”。两个数据集中的点会用不同的颜色来区分这两个比例.
一个例子如下所示:
d1 = data.frame(x=c(100, 200, 300, 400), y=seq(0.1, 0.4, by=0.1)) # 1st dataset
d2 = data.frame(x=c(100, 200, 300, 400), y=seq(0.8, 0.5, by=-0.1)) # 2nd dataset
p1 = ggplot(data = d1, aes(x=x, y=y)) + geom_point()
p2 = ggplot(data = d2, aes(x=x, y=y)) + geom_point() +
scale_y_continuous(position = "right")
p1
p2
Run Code Online (Sandbox Code Playgroud)
在ggplot2,我不能这样做,p1+p2因为它会显示一条错误消息Error: Don't know how to add o to a plot。请帮忙。谢谢!
我的数据如下:
structure(list(Year = 1994:2016, Kcalpd = c(86L, 91L, 98L, 107L,
116L, 126L, 123L, 112L, 103L, 102L, 103L, 92L, 77L, 59L, 43L,
29L, 19L, 14L, 13L, 12L, 12L, 10L, 9L), Thtonnes = c(728.364,
757.467, 780.423, 792.756, 701.685, 720.71, 677.292, 761.649,
668.218, 679.042, 974.355, 1005.035, 1123.09, 1055.07, 1092.498,
1100.654, 899.767, 1018.462, 1046.096, 1084.173, 1158.217, 802.194,
276.773)), row.names = c(NA, -23L), class = "data.frame", .Names = c("Year",
"Kcalpd", "Thtonnes"))
Run Code Online (Sandbox Code Playgroud)
并且,我的代码如下:
scaleFactor <- max(wfd$Thtonnes) / max(wfd$Kcalpd)
ggplot(wfd, aes(x=Year)) +
geom_col(aes(y=Thtonnes), fill="blue") +
geom_col(aes(y=Kcalpd * …Run Code Online (Sandbox Code Playgroud)