web-dev-qa-db-ja.com

それぞれがRの一意の色で複数の線(データ系列)をプロットします

私はRにかなり慣れていないので、次の質問があります:

複数の行(データ系列)を持つRのプロットを生成しようとしています。これらの各行はカテゴリであり、一意の色が必要です。

現在、私のコードは次のように設定されています:

最初に、空のプロットを作成しています:

plot(1,type='n',xlim=c(1,10),ylim=c(0,max_y),xlab='ID', ylab='Frequency')

次に、各カテゴリについて、次のような「for」ループを使用して、この空のプロットにラインをプロットしています。

for (category in categories){
lines(data.frame.for.this.category, type='o', col=sample(Rainbow(10)), lwd=2)
}

ここには8つのカテゴリがあるため、プロットには8つのラインが生成されます。ご覧のとおり、私はrainbows()関数から色をサンプリングして、各行の色を生成しようとしています。

ただし、プロットが生成されると、同じ色の線が複数あることがわかります。たとえば、これらの8行のうち3行は緑色です。

これらの8行のそれぞれに一意の色を付けるにはどうすればよいですか?

また、プロットの凡例にこの一意性をどのように反映しますか? legend()関数を検索しようとしていましたが、各カテゴリのこの一意の色を反映するためにどのパラメーターを使用する必要があるかは明確ではありませんでしたか?

どんな助けや提案も大歓迎です。

59
user1418321

データが ワイド形式matplotにある場合、これはよく忘れられます:

 dat <- matrix(runif(40,1,20),ncol=4) # make data
 matplot(dat, type = c("b"),pch=1,col = 1:4) #plot
 legend("topleft", legend = 1:4, col=1:4, pch=1) # optional legend

また、ggplotなどのプロットパラメーターのほとんどがmatplot()を使用してplot()と同じであるというpchのようなものに不慣れな人には、追加のボーナスがあります。 enter image description here

63
user1317221_G

ggplot2ソリューションが必要な場合、データをこの形式に整形できる場合はこれを行うことができます(以下の例を参照)

# dummy data
set.seed(45)
df <- data.frame(x=rep(1:5, 9), val=sample(1:100, 45), 
                   variable=rep(paste0("category", 1:9), each=5))
# plot
ggplot(data = df, aes(x=x, y=val)) + geom_line(aes(colour=variable))

ggplot2_geom_line

46
Arun

基本グラフィックスを使用してこれを行うための正しい一般的な戦略がありますが、指摘したように、本質的には各行に10個のセットからランダムな色を選択するようRに指示しています。それを考えると、同じ色の2本の線がときどき現れるのは驚くことではありません。基本グラフィックスを使用した例を次に示します。

plot(0,0,xlim = c(-10,10),ylim = c(-10,10),type = "n")

cl <- Rainbow(5)

for (i in 1:5){
    lines(-10:10,runif(21,-10,10),col = cl[i],type = 'b')
}

enter image description here

type = "n"を使用して、ウィンドウをセットアップする元の呼び出しでのすべてのプロットを抑制し、clをforループ内でインデックス付けすることに注意してください。

26
joran

lines()functionを使用して、同じチャートに複数の線を描画できます

# Create the data for the chart.
v <- c(7,12,28,3,41)
t <- c(14,7,6,19,3)

# Give the chart file a name.
png(file = "line_chart_2_lines.jpg")

# Plot the bar chart.
plot(v,type = "o",col = "red", xlab = "Month", ylab = "Rain fall", 
   main = "Rain fall chart")

lines(t, type = "o", col = "blue")

# Save the file.
dev.off()

出力 enter image description here

10
Shafiq

@Arunダミーデータを使用して:)ここでlatticeソリューション:

xyplot(val~x,type=c('l','p'),groups= variable,data=df,auto.key=T)

enter image description here

8
agstudy

私は知っている、その答えは古い投稿であるが、同じ投稿を探して出会ったように、他の誰かもここに来るかもしれない

関数ggplotにcolorを追加することで、プロットに存在するグループに関連するさまざまな色の線を実現できます。

ggplot(data=Set6, aes(x=Semana, y=Net_Sales_in_pesos, group = Agencia_ID, colour = as.factor(Agencia_ID)))    

そして

geom_line() 

Line Graph with Multiple colors

5
Sweta

ベースplot関数をforループとともに使用する@joranの answer に加えて、ベースplotlapplyとともに使用するを使用できます。

plot(0,0,xlim = c(-10,10),ylim = c(-10,10),type = "n")

cl <- Rainbow(5)

invisible(lapply(1:5, function(i) lines(-10:10,runif(21,-10,10),col = cl[i],type = 'b')))
  • ここで、invisible関数は、単にlapplyがコンソールでリスト出力を生成するのを防ぐのに役立ちます(リストではなく、関数によって提供される再帰が必要なためです)。

enter image description here

ご覧のとおり、forループアプローチを使用した場合とまったく同じ結果が得られます。

では、なぜlapplyを使用するのですか?

lapplyは、Rでforよりも高速/優れたパフォーマンスを示すことが示されています(たとえば、 here を参照してください。ただし、インスタンスについては here を参照してください)そうでない場合)、この場合はほぼ同じように実行されます:

lapplyアプローチとforアプローチの両方で行数を50000に増やすには、それぞれシステムの46.346.55秒かかりました。

  • したがって、lapplyはわずかに高速でしたが、無視できるほどわずかでした。この速度の違いは、より大きな/より複雑なグラフ作成に役立つかもしれませんが、正直なところ、50000行はおそらくかなり良い天井です...

したがって、「なぜlapply?」に対する答えは、単に同様に機能する代替アプローチにすぎません。 :)

4

以下に、興味がある場合に凡例を含むサンプルコードを示します。

# First create an empty plot.
plot(1, type = 'n', xlim = c(xminp, xmaxp), ylim = c(0, 1), 
     xlab = "log transformed coverage", ylab = "frequency")

# Create a list of 22 colors to use for the lines.
cl <- Rainbow(22)

# Now fill plot with the log transformed coverage data from the
# files one by one.
for(i in 1:length(data)) {
    lines(density(log(data[[i]]$coverage)), col = cl[i])
    plotcol[i] <- cl[i]
}
legend("topright", legend = c(list.files()), col = plotcol, lwd = 1,
       cex = 0.5)
3

plot()を使用して行を追加する別の方法を次に示します。

まず、関数par(new=T)を使用します

オプション:

http://cran.r-project.org/doc/contrib/Lemon-kickstart/kr_addat.html

色を変えるには、col()が必要です。

余分な軸の記述を避けるには、2番目以降のプロットにxaxt="n"およびyaxt="n"を使用します。

2
boczniak767