Estou usando R e tenho dois quadros de dados: cenouras e pepinos. Cada quadro de dados possui uma única coluna numérica que lista o comprimento de todas as cenouras medidas (total: 100 mil cenouras) e pepinos (total: 50 mil pepinos).
Desejo plotar dois histogramas - comprimento da cenoura e pepino - no mesmo gráfico. Eles se sobrepõem, então acho que também preciso de um pouco de transparência. Também preciso usar frequências relativas e não números absolutos, pois o número de instâncias em cada grupo é diferente.
algo assim seria bom, mas não entendo como criá-lo nas minhas duas tabelas:
Respostas:
Essa imagem à qual você vinculou era para curvas de densidade, não para histogramas.
Se você leu no ggplot, talvez a única coisa que falta é combinar seus dois quadros de dados em um longo.
Então, vamos começar com algo como o que você tem, dois conjuntos separados de dados e combiná-los.
Depois disso, que é desnecessário se seus dados já estiverem em formato longo, você precisará apenas de uma linha para fazer seu gráfico.
Agora, se você realmente queria histogramas, o seguinte funcionará. Observe que você deve alterar a posição do argumento "pilha" padrão. Você pode sentir falta disso se realmente não tiver uma ideia de como devem ser seus dados. Um alfa mais alto parece melhor lá. Observe também que eu fiz histogramas de densidade. É fácil remover o
y = ..density..
para recolocar as contagens.fonte
ggplot(vegLengths, aes(length, fill = veg)) + geom_bar(pos="dodge")
. Isso criará histogramas entrelaçados, como no MATLAB.Aqui está uma solução ainda mais simples usando gráficos básicos e mistura alfa (que não funciona em todos os dispositivos gráficos):
A chave é que as cores são semi-transparentes.
Edite, mais de dois anos depois : como isso acabou de ser votado, acho que também posso adicionar um visual do que o código produz como mistura alfa é tão útil:
fonte
plot
comandos? Você pode colocar todas essas opções noshist
comandos e apenas duas nas duas linhas.plot
comando diretamente no comando hist, como eu disse. A publicação do código não serve para comentários.Aqui está uma função que escrevi que usa pseudo-transparência para representar histogramas sobrepostos
Aqui está outra maneira de fazer isso usando o suporte de R para cores transparentes
Os resultados acabam parecendo algo assim:
fonte
postscript
)Já existem respostas bonitas, mas pensei em adicionar isso. Parece bom para mim. (Números aleatórios copiados do @Dirk).
library(scales)
é necessário`O resultado é...
Atualização: Essa função sobreposta também pode ser útil para alguns.
Eu sinto que o resultado
hist0
é mais bonito do que parecerhist
O resultado de
é
fonte
Aqui está um exemplo de como você pode fazer isso nos gráficos R "clássicos":
O único problema com isso é que parece muito melhor se as quebras do histograma estiverem alinhadas, o que pode ter que ser feito manualmente (nos argumentos passados para
hist
).fonte
ggplot
) que responde diretamente se seus dois histogramas têm tamanhos de amostra substancialmente diferentes.breaks=seq(min(data$some_property), max(data$some_property), by=(max_prop - min_prop)/20)
Aqui está a versão como a do ggplot2 que eu dei apenas na base R. Copiei algumas do @nullglob.
gerar os dados
Você não precisa colocá-lo em um quadro de dados como no ggplot2. A desvantagem desse método é que você precisa escrever muito mais detalhes da plotagem. A vantagem é que você tem controle sobre mais detalhes da trama.
fonte
@Dirk Eddelbuettel: A ideia básica é excelente, mas o código mostrado pode ser aprimorado. [Demora muito para explicar, portanto, uma resposta separada e não um comentário.]
A
hist()
função, por padrão, desenha plotagens, então você precisa adicionar aplot=FALSE
opção. Além disso, é mais claro estabelecer a área da plotagem por meio de umaplot(0,0,type="n",...)
chamada na qual você pode adicionar os rótulos dos eixos, o título da plotagem etc. Por fim, gostaria de mencionar que também se pode usar sombreamento para distinguir os dois histogramas. Aqui está o código:E aqui está o resultado (um pouco grande demais por causa do RStudio :-)):
fonte
postscript
dispositivos.A API R da Plotly pode ser útil para você. O gráfico abaixo está aqui .
Divulgação completa: estou no time.
fonte
Tantas ótimas respostas, mas como acabei de escrever uma função (
plotMultipleHistograms()
) para fazer isso, pensei em adicionar outra resposta.A vantagem dessa função é que ela define automaticamente os limites apropriados dos eixos X e Y e define um conjunto comum de posições que utiliza em todas as distribuições.
Veja como usá-lo:
A
plotMultipleHistograms()
função pode ter qualquer número de distribuições, e todos os parâmetros de traçagem gerais devem trabalhar com ele (por exemplo:las
,main
, etc.).fonte