r语言如何用一个纵坐标画出画两条线形成两个直角

新版本的maptools包对很多函数进行了修改,对于修改的内容,文章中用加粗的文字进行了说明。
鉴于最近有不少人在讨论用R软件绘制地图的问题,我也就跟着凑了凑热闹,对相应的方法学习了一番。下面的这篇文章是一个初步的介绍,还有很多内容仍在学习和探索中,如果大家有什么意见或建议,我将根据自己学习的情况对文章进行进一步的补充。 在R中绘制地图其实是十分方便的,最直接的办法大概就是安装maps和mapdata这两个包,然后输入下面的命令:
rlibrary(maps)
library(mapdata)
map(&china&)
其中map()函数还可以加上很多参数,在这里就不一一详述,具体的用法只需问号之。然而仔细看一看这张地图你会发现重庆市和四川省仍然是浑然一体,可见该地图的数据应该是有些年头了。 幸运的是,通过谢益辉的这篇博文我们已经可以大体知道该如何操作了,下面就为大家介绍一下具体的步骤。
首先,从这里下载中国地图的GIS数据,这是一个压缩包,完全解压后包含三个文件(bou2_4p.dbf、bou2_4p.shp和bou2_4p.shx),将这三个文件解压到同一个目录下,并在R中设好相应的工作空间,然后安装maptools包,运行如下程序:
rlibrary(maptools);
x=read.shape('bou2_4p.shp');#下文中会继续用到x这个变量,
#如果你用的是其它的名称,
#请在下文的程序中也进行相应的改动。
【修改】新版本的maptools包不再提供read.shape()函数,请用readShapePoly()代替。 这时一张完整的中国地图就已经画好了。但是在实际使用的过程中,我们往往会根据自己的需要对地图中的某些省份着以特定的颜色,这时就可以通过调节plot命令中的fg参数来予以实现。然而为了清楚地说明这部分的内容,我需要插播一段R绘制地图的原理。
在绘制地图时,每一个省市自治区或者岛屿都是用一个多边形来表示的。之前的GIS数据,其实就是提供了每一个行政区其多边形逐点的坐标,然后R软件通过顺次连接这些坐标,就绘制出了一个多边形区域。在上面的数据中,一共包含了925个多边形的信息,之所以有这么多是因为一些省份有很多小的附属岛屿。在这925个多边形中,每一个都对应一个唯一的ID,编号分别从1到25。
回到刚才的话题,plot命令中的fg参数在本例中应该是一个长度为925的向量,其第i个分量的取值就代表了地图中第i个多边形的颜色。一个简单的尝试是运行下面这个命令看看效果: plot(x,fg=gray(924:0/924));
【修改】新版本的maptools包的绘图参数也有所改变,请将fg换成col。
于是自然就产生了一个问题:如何获取某一个特定地区的ID,进而设置我们想要的颜色?事实上,在变量x中,就已经存储了我们想要的信息。在R中输入“x[2]”或“x$att.data”,会得到一个925行7列的数据框,这其实是bou2_4p.dbf这个文件中存储的信息,之前的read.shape()函数虽然读取的是bou2_4p.shp文件,但在默认情况下会把dbf文件的信息也放到变量之中。对于这个数据框,其行名就是每一个区域的ID编号,第一列和第二列分别是面积和周长,最后一列是该区域所属的行政区名,其它的列应该也是一些编号性质的变量。于是,通过查找相应的行政区对应的行名,就可以对fg参数进行赋值了。下面是我编的一个函数,用来生成所需的fg向量:
rgetColor=function(mapdata,provname,provcol,othercol)
f=function(x,y) ifelse(x %in% y,which(y==x),0);
colIndex=sapply(mapdata$att.data$NAME,f,provname);
fg=c(othercol,provcol)[colIndex+1];
return(fg);
【修改】地图数据的组织形式有所变化,上面函数中的mapdata$att.data$NAME需要替换为mapdata@data$NAME。
其中mapdata是存放地图数据的变量,在上面的例子中就是x,provname是需要改变颜色的地区的名称,provcol是对应于provname的代表颜色的向量(名称和数字均可),othercol是其它地区的颜色。举例如下:
r provname=c(&北京市&,&天津市&,&上海市&,&重庆市&);
provcol=c(&red&,&green&,&yellow&,&purple&);
plot(x,fg=getColor(x,provname,provcol,&white&));
注意provname一定要写地区的全称,写法可以参照下面这条命令生成的向量:as.character(na.omit(unique(x$att.data$NAME)));
由此生成的向量有33个元素,少了澳门特别行政区,这是这个数据中的一块瑕疵。在x$att.data的第899行有一个NA,不知道它代表的是否就是澳门。
利用类似的方法就可以根据自己的需要对不同的区域进行着色,下面再举一例。从国家统计局获取2007年我国各地区的人口数据,然后根据人口的多少对各省份进行着色。程序如下:
provname=c(&北京市&,&天津市&,&河北省&,&山西省&,&内蒙古自治区&,
&辽宁省&,&吉林省&,&黑龙江省&,&上海市&,&江苏省&,
&浙江省&,&安徽省&,&福建省&,&江西省&,&山东省&,
&河南省&,&湖北省&,&湖南省&,&广东省&,
&广西壮族自治区&,&海南省&,&重庆市&,&四川省&,&贵州省&,
&云南省&,&西藏自治区&,&陕西省&,&甘肃省&,&青海省&,
&宁夏回族自治区&,&新疆维吾尔自治区&,&台湾省&,
&香港特别行政区&);
pop=c(43,98,58,7625,
6,14,284,,
552,610,3);
provcol=rgb(red=1-pop/max(pop)/2,green=1-pop/max(pop)/2,blue=0);
plot(x,fg=getColor(x,provname,provcol,&white&),xlab=&&,ylab=&&);
其中颜色越深的地方代表人口数越多,反之为人口数越少。
此外,在绘制地图的过程中,还有一个比较有用的参数是recs,它是一个由多边形ID组成的向量,表示在地图中只画出这些ID所代表的区域。利用这个参数,就可以画出某一部分的地图,例如下面的例子是我国中部六省的地图:
getID=function(mapdata,provname)
index=mapdata$att.data$NAME %in%
ids=rownames(mapdata$att.data[index,]);
return(as.numeric(ids));
midchina=c(&河南省&,&山西省&,&湖北省&,&安徽省&,&湖南省&,&江西省&);
plot(x,recs=getID(x,midchina),fg=&green&,ol=&white&,xlab=&&,ylab=&&);
上面的getID()是我编写的一个功能与getColor()类似的函数,用来返回指定省份的ID。
【修改】新版本的maptools包的绘图函数已经取消了recs这个参数,现在要实现这个功能,可以在颜色上把不需要的省份变成白色,其中填充色用col参数,边界颜色用border参数。例如上面的例子可以用下面的函数来实现:
plot(x, col = getColor(x, midchina, rep(&green&, 6),
&white&), border = &white&, xlab = &&, ylab = &&)
最后要说的是,在画出的图上仍然可以用points()函数和text()函数加上点和文字,而maptools包中还提供了一个pointLabel()函数,用来解决文本标签的重叠问题。这部分内容请参阅博文:用R画中国地图并标注城市位置,以及避免文本标签重叠:maptools中的pointLabel()。
从以上的内容来看,本文所述的都是一些最基本的绘图方法,还没有对地理信息数据进行更进一步的分析。如果有机会的话,这一主题的下一篇文章将为大家介绍地图数据的组成结构,并说明如何将不同格式的地理数据整合起来,例如如何在上面的地图上绘制出我国的铁路、水系分布等内容。
(责任编辑:itongji)苹果/安卓/wp
积分 539, 距离下一级还需 261 积分
权限: 自定义头衔, 签名中使用图片
道具: 彩虹炫, 雷达卡, 热点灯, 雷鸣之声, 涂鸦板, 金钱卡, 显身卡, 匿名卡, 抢沙发下一级可获得
权限: 隐身
购买后可立即获得
权限: 隐身
道具: 金钱卡, 雷鸣之声, 彩虹炫, 雷达卡, 涂鸦板, 热点灯
如题,想要在一幅图上画出两条不同的密度曲线图(图在下方),不知道如何实现,如果有知道的请帮个忙,谢谢!!!
从谢老大的书上看到由直方图到密度图的作法,但没有两条画在一起的。以下为谢老大书上的代码,供大家参考,希望大家可以帮个忙,谢谢~~
&hist(geyser$waiting, freq = FALSE, xlab = &waiting&,
+ main = &(2) freq = FALSE&)
&hist(geyser$waiting, probability = TRUE, main = '')
&lines(density(geyser[['waiting']]))
另外,还有个命令和谢老大的有异曲同工之处,一并贴出来吧(转用的):
&x=rnorm(1000)
&hist(x,prob=T,main=&histogram with fitted density curve,bw=0.5&)
&lines(density(x,bw=0.5),col=&red&,lwd=2)
plot(density(x))
> lines(density(y))
载入中......
& x &- rnorm(100)
& y &- runif(100, -2, 2)
& plot(density(x))
& lines(density(y))
热心帮助其他会员
总评分:&学术水平 + 1&
热心指数 + 1&
信用等级 + 1&
01:32:57 上传
& &不好意思,图好像没了,所以补传一张!!!
qoiqpwqr 发表于
& x&&y&&plot(density(x))
& lines(density(y))非常感谢您的回答,可以追问一句吗,如果有三条或三条以上的情况呢?谢谢!
ffcxy2005 发表于
非常感谢您的回答,可以追问一句吗,如果有三条或三条以上的情况呢?谢谢!plot之后,
直接 lines(density(x2))
lines(density(x3))
热心帮助其他会员
总评分:&学术水平 + 1&
热心指数 + 1&
信用等级 + 1&
如果该贴对您有些许帮助,希望你能回复一下或者评一下热心指数!谢谢!
多lines几次就好了,有个需要注意的地方,xrange需要自己先设定好,否则后面画的曲线否则很难看
kk22boy 发表于
plot之后,
直接 lines(density(x2))
lines(density(x3))谢谢~那如果在样本数和带宽不一定相等的情况下,画在同一张图上好像会出问题是吧
ffcxy2005 发表于
谢谢~那如果在样本数和带宽不一定相等的情况下,画在同一张图上好像会出问题是吧图片的尺寸是按照第一个图的数据确定的,所以要注意一下,比如y轴要选为所有数据的最大的那个。
qoiqpwqr 发表于
图片的尺寸是按照第一个图的数据确定的,所以要注意一下,比如y轴要选为所有数据的最大的那个。我出现的问题好像不是Y轴的问题,而是X轴的问题,X轴的宽度不够所有的曲线。比如,第一条曲线在图上全部显示了,但第二条、第三条却只出现左边的一半,右边就没有了。对于这种情况而言,好像单纯向Y轴设置数据中最大的不一样,因为X轴表示的是曲线的区间,不知道这种又该如何解决?谢谢~!
无论是x y 轴, 你把xlim ylim设置成你的所用变量里面 范围最大的那个就可以了
极端情况 就是值域太大 有些小变化的曲线体现不出来 这就要具体情况了。
观点有启发
总评分:&学术水平 + 1&
热心指数 + 1&
初级热心勋章
初级热心勋章
初级信用勋章
初级信用勋章
初级学术勋章
初级学术勋章
中级热心勋章
中级热心勋章
高级热心勋章
高级热心勋章
无限扩大经管职场人脉圈!每天抽选50位免费名额,现在就扫& 论坛VIP& 贵宾会员& 可免费加入
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
如有投资本站或合作意向,请联系(010-);
邮箱:service@pinggu.org
投诉或不良信息处理:(010-)
京ICP证090565号
京公网安备号
论坛法律顾问:王进律师R语言在一张图上画多个图片办法
1、用par(new=TRUE)命令,就像matlab里的hold
2、par(mfrow=c(2,3))&
&一个图版显示2行,3列,之后按照常规作图就可以了。
3、如果在原有的图形上添加新的内容,如果用plot(),则可以选
plot(x, add=TRUE)
4、低水平的绘图函数可以直接在图形上添加元素,如 points(), lines(),等等
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。r语言中,画出了频率分布直方图,怎么在图上添加概率分布曲线?
可以用内置的graphic包来画,就是plot()和curve()也可以用ggplot2来画,后者更灵活.graphic#&先生成一组随机数x&&-&rnorm(2000)#&画频率直方图,&分30个binhist(x,&freq&=&F,&breaks&=&30)&#&再画概率分布曲线lines(density(x,&bw=.5),&col=&red&,&lwd=2)2.ggplot2#&准备工作,&把x设成一个数据集library(ggplot2)data&&-&data.frame(x&=&x)#&生成底层和直方图,概率线的图层p&&-&ggplot(data,&aes(x&=&x,&y&=&..density..))p&&-&p&+&geom_histogram(fill&=&&navy&)p&&-&p&+&geom_density(colour&=&&green&)p画出来风格不太一样,看你口味了
为您推荐:
其他类似问题
扫描下载二维码6134人阅读
R Language(43)
在R语言中绘制坐标轴时,如何将坐标轴的刻度画在图内呢?
下面有一个完整的例子:
aixs.test&-function(){
&& &x&-rnorm(7)
&&& #print(x)
&& &y&-round(c(1:5)*(max(x)-min(x))/5+min(x),digits=2)
&& &xx&-round(c(1:5)*length(x)/5,digits=2)
&&& #print(y)
&& &opar&-par(no.readonly=TRUE)
&& &par(mar=c(5,4,4,8)+0.1)
&& &plot(x, type=&b&, pch=21, col=&red&, xaxt=&n&,yaxt=&n&, lty=3, ann=FALSE)
&& &axis(1, at=xx, labels=xx, col.axis=&black&, las=0, tck=0.03)
&& &axis(2, at=y, labels=y, col.axis=&black&, las=2, tck=0.03)
&& &title(&An Example of Creative Axes&, xlab=&X values&, ylab=&Y values&)
&& &par(opar)
aixs.test();
这里说明如下:
(1)x为要绘制的数据,这里为一正态分布函数产生。
(2)y 为绘制y轴分刻度用,主要是将绘图区均匀分为5个刻度。
(3)xx为绘制xx轴的刻度,也是设置绘制5个均匀刻度。
(4)xaxt=&n&,yaxt=&n&表示不绘制x轴或y轴。
(5)las表示坐标轴标签平行于坐标轴还是垂直于坐标轴,0-平行;2-垂直
(6)tck坐标轴刻度长度,正数为在图内侧画,负数为在外侧画。
(7)axis()为绘制坐标轴的函数。
(8)title()用来设置设置标题,y轴和x轴的标签。xlab,ylab分别为x,y轴标签。
(9)par()用来修改图形参数:
par(mar=c(5,4,4,8)+0.1)
生效后直至会话结束,为了防止图形设置对其他绘图的影响,先使用opar变量保存该设置,在运行结束后恢复
&&&& opar&-par(no.readonly=TRUE)
&&& par(opar)
(10)ann参数表示高级绘图函数已经包含的默认的标题和标签,可以用ann=FALSE取消默认的标题和标签。
最终效果为:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1201864次
积分:14874
积分:14874
排名:第512名
原创:377篇
转载:156篇
评论:102条
(6)(18)(4)(10)(15)(5)(3)(12)(22)(13)(1)(11)(13)(3)(11)(10)(6)(4)(7)(4)(8)(3)(9)(20)(15)(1)(5)(5)(11)(7)(3)(3)(2)(7)(4)(1)(4)(1)(1)(6)(1)(3)(6)(2)(5)(6)(10)(23)(14)(12)(8)(39)(16)(5)(32)(10)(15)(2)(12)(1)(1)(9)(1)(2)(3)(8)

我要回帖

更多关于 cad怎么同时画两条线 的文章

 

随机推荐