私は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()
関数を検索しようとしていましたが、各カテゴリのこの一意の色を反映するためにどのパラメーターを使用する必要があるかは明確ではありませんでしたか?
どんな助けや提案も大歓迎です。
データが ワイド形式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
のようなものに不慣れな人には、追加のボーナスがあります。
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))
基本グラフィックスを使用してこれを行うための正しい一般的な戦略がありますが、指摘したように、本質的には各行に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')
}
type = "n"
を使用して、ウィンドウをセットアップする元の呼び出しでのすべてのプロットを抑制し、cl
をforループ内でインデックス付けすることに注意してください。
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()
@Arunダミーデータを使用して:)ここでlattice
ソリューション:
xyplot(val~x,type=c('l','p'),groups= variable,data=df,auto.key=T)
私は知っている、その答えは古い投稿であるが、同じ投稿を探して出会ったように、他の誰かもここに来るかもしれない
関数ggplotにcolorを追加することで、プロットに存在するグループに関連するさまざまな色の線を実現できます。
ggplot(data=Set6, aes(x=Semana, y=Net_Sales_in_pesos, group = Agencia_ID, colour = as.factor(Agencia_ID)))
そして
geom_line()
ベースplot
関数をfor
ループとともに使用する@joranの answer に加えて、ベースplot
をlapply
とともに使用するを使用できます。
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
がコンソールでリスト出力を生成するのを防ぐのに役立ちます(リストではなく、関数によって提供される再帰が必要なためです)。ご覧のとおり、for
ループアプローチを使用した場合とまったく同じ結果が得られます。
では、なぜlapply
を使用するのですか?
lapply
は、Rでfor
よりも高速/優れたパフォーマンスを示すことが示されています(たとえば、 here を参照してください。ただし、インスタンスについては here を参照してください)そうでない場合)、この場合はほぼ同じように実行されます:
lapply
アプローチとfor
アプローチの両方で行数を50000に増やすには、それぞれシステムの46.3
と46.55
秒かかりました。
lapply
はわずかに高速でしたが、無視できるほどわずかでした。この速度の違いは、より大きな/より複雑なグラフ作成に役立つかもしれませんが、正直なところ、50000行はおそらくかなり良い天井です...したがって、「なぜlapply
?」に対する答えは、単に同様に機能する代替アプローチにすぎません。 :)
以下に、興味がある場合に凡例を含むサンプルコードを示します。
# 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)
plot()
を使用して行を追加する別の方法を次に示します。
まず、関数par(new=T)
を使用します
オプション:
http://cran.r-project.org/doc/contrib/Lemon-kickstart/kr_addat.html
色を変えるには、col()
が必要です。
余分な軸の記述を避けるには、2番目以降のプロットにxaxt="n"
およびyaxt="n"
を使用します。