Plot meerdere regels (gegevensreeksen) elk met een unieke kleur in R

Ik ben vrij nieuw bij R en ik heb de volgende vragen:

Ik probeer een plot in R te genereren die meerdere regels heeft (gegevensreeksen). Elk van deze lijnen is een categorie en ik wil dat het een unieke kleur heeft.

Momenteel is mijn code op deze manier ingesteld:

Eerst maak ik een leeg perceel :

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

Vervolgens teken ik voor elk van mijn categorieën lijnen in deze lege plot met behulp van een “for”-lus zoals:

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

Er zijn hier 8 categorieën, en dus zijn er 8 lijnen geproduceerd in de plot. Zoals je kunt zien, probeer ik een kleur uit de regenbogen()-functie te samplen om voor elke regel een kleur te genereren.

Als de plot wordt gegenereerd, merk ik echter dat er meerdere lijnen zijn die dezelfde kleur hebben. 3 van die 8 lijnen hebben bijvoorbeeld een groene kleur.

Hoe zorg ik ervoor dat elk van deze 8 lijnen een unieke kleur heeft?

Ook, hoe geef ik deze uniciteit weer in de legende van de plot? Ik probeerde de functie legend() op te zoeken, maar het was niet duidelijk welke parameter ik moest gebruiken om deze unieke kleur voor elke categorie weer te geven?

Alle hulp of suggesties worden zeer op prijs gesteld.


Antwoord 1, autoriteit 100%

Als uw gegevens in groot formaat matplot zijn hiervoor gemaakt en vaak vergeten:

 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

Er is ook de toegevoegde bonus voor degenen die niet bekend zijn met dingen als ggplot dat de meeste plotparameters zoals pch enz. hetzelfde zijn met behulp van matplot() als plot().
voer hier de afbeeldingsbeschrijving in


Antwoord 2, autoriteit 70%

Als u een ggplot2-oplossing wilt, kunt u dit doen als u uw gegevens in dit formaat kunt aanpassen (zie voorbeeld hieronder)

# 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


Antwoord 3, autoriteit 43%

Je hebt de juiste algemene strategie om dit te doen met behulp van basisafbeeldingen, maar zoals werd opgemerkt, zeg je in feite tegen R om een ​​willekeurige kleur te kiezen uit een set van 10 voor elke regel. Het is dan ook niet verwonderlijk dat je af en toe twee lijnen met dezelfde kleur krijgt. Hier is een voorbeeld met basisafbeeldingen:

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')
}

voer hier de afbeeldingsbeschrijving in

Let op het gebruik van type = "n" om alle plotten te onderdrukken in de oorspronkelijke aanroep om het venster in te stellen, en de indexering van cl binnen de for-lus.


Antwoord 4, autoriteit 21%

Er kan meer dan één lijn op dezelfde kaart worden getekend met behulp van de lines()functie

# 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()

UITGANG
voer hier de afbeeldingsbeschrijving in


Antwoord 5, autoriteit 10%

Gebruik @Arun dummy data 🙂 hier een lattice oplossing:

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

voer hier de afbeeldingsbeschrijving in


Antwoord 6, autoriteit 10%

Ik weet het, het is een oud bericht om te beantwoorden, maar zoals ik tegenkwam toen ik op zoek was naar hetzelfde bericht, kan iemand anders hier ook terecht

Door toe te voegen: kleur in de ggplot-functie, kon ik de lijnen bereiken met verschillende kleuren die verband houden met de groep die in de plot aanwezig is.

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

en

geom_line() 

Lijngrafiek met meerdere kleuren


Antwoord 7, autoriteit 10%

Naast @joran’s antwoord met behulp van de basis plot-functie met een for loop, kun je ook basis plot gebruiken met 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')))
  • Hier dient de functie invisible eenvoudigweg om te voorkomen dat lapply een lijstuitvoer in uw console produceert (aangezien we alleen de recursie willen die door de functie wordt geboden, niet een lijst).

voer hier de afbeeldingsbeschrijving in

Zoals je kunt zien, produceert het exact hetzelfde resultaat als het gebruik van de for-lusbenadering.

Dus waarom zou je lapply gebruiken?

Hoewel is aangetoond dat lapply sneller/beter presteert dan for in R (zie bijvoorbeeld hier; zie echter hier voor een instantie waar het niet is), in dit geval presteert het ongeveer hetzelfde:

Het verhogen van het aantal regels tot 50000 voor zowel de lapply– als de for-benadering kostte mijn systeem 46.3 en 46.55 seconden, respectievelijk.

  • Dus, hoewel lapply net iets sneller was, was het verwaarloosbaar. Dit snelheidsverschil kan van pas komen bij grotere/complexere grafieken, maar laten we eerlijk zijn, 50000 lijnen is waarschijnlijk een redelijk goed plafond…

Dus het antwoord op “waarom lapply?”: het is gewoon een alternatieve aanpak die even goed werkt. 🙂


Antwoord 8, autoriteit 4%

Hier is een voorbeeldcode met een legenda als dat van belang is.

# 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)

Antwoord 9, autoriteit 2%

Hier is een andere manier om regels toe te voegen met behulp van plot():

Gebruik eerst de functie par(new=T)

optie:

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

Als je ze anders wilt kleuren, heb je col() nodig.

Om overbodige assenbeschrijvingen te vermijden, gebruikt u xaxt="n" en yaxt="n"
voor tweede en verdere percelen.


Antwoord 10

In het geval dat de x-as een factor / discrete variabele is en men de volgorde van de variabele wil behouden (verschillende waarden die overeenkomen met verschillende groepen) om het groepseffect te visualiseren. De volgende code zou doen:

library(ggplot2)
set.seed(45)
# dummy data
df <- data.frame(x=rep(letters[1:5], 9), val=sample(1:100, 45), 
                   variable=rep(paste0("category", 1:9), each=5))
# This ensures that x-axis (which is a factor variable)  will be ordered appropriately
df$x <- ordered(df$x, levels=letters[1:5])
ggplot(data = df, aes(x=x, y=val, group=variable, color=variable)) + geom_line() + geom_point() + ggtitle("Multiple lines with unique color")

voer hier de afbeeldingsbeschrijving in
Merk ook op dat: groep=variabele toevoegen de waarschuwingsinformatie verwijderen: “geom_path: Elke groep bestaat uit slechts één observatie. Moet u deze aanpassen
de groepsesthetiek?”

LEAVE A REPLY

Please enter your comment!
Please enter your name here

seven − 6 =

Other episodes