J'utilise R et j'ai deux trames de données: les carottes et les concombres. Chaque bloc de données comporte une seule colonne numérique qui répertorie la longueur de toutes les carottes mesurées (total: 100 000 carottes) et concombres (total: 50 000 concombres).
Je souhaite tracer deux histogrammes - longueur des carottes et longueurs des concombres - sur la même parcelle. Ils se chevauchent, donc je suppose que j'ai aussi besoin de transparence. J'ai également besoin d'utiliser des fréquences relatives et non des nombres absolus car le nombre d'instances dans chaque groupe est différent.
quelque chose comme ça serait bien mais je ne comprends pas comment le créer à partir de mes deux tables:
Réponses:
Cette image à laquelle vous avez lié était pour les courbes de densité, pas les histogrammes.
Si vous avez lu sur ggplot, peut-être que la seule chose qui vous manque est de combiner vos deux trames de données en une longue.
Commençons donc par quelque chose comme ce que vous avez, deux ensembles de données distincts et combinons-les.
Après cela, ce qui n'est pas nécessaire si vos données sont déjà au format long, vous n'avez besoin que d'une seule ligne pour créer votre tracé.
Maintenant, si vous vouliez vraiment des histogrammes, ce qui suit fonctionnera. Notez que vous devez changer de position à partir de l'argument "pile" par défaut. Vous pourriez le manquer si vous n'avez pas vraiment une idée de ce à quoi vos données devraient ressembler. Un alpha plus élevé semble mieux là-bas. Notez également que je lui ai fait des histogrammes de densité. Il est facile de supprimer le
y = ..density..
pour le ramener au décompte.la source
ggplot(vegLengths, aes(length, fill = veg)) + geom_bar(pos="dodge")
. Cela fera des histogrammes entrelacés, comme dans MATLAB.Voici une solution encore plus simple utilisant des graphiques de base et un mélange alpha (qui ne fonctionne pas sur tous les périphériques graphiques):
La clé est que les couleurs sont semi-transparentes.
Edit, plus de deux ans plus tard : comme cela vient d'obtenir une augmentation, je pense que je pourrais aussi bien ajouter un visuel de ce que le code produit car l'alpha-blending est tellement utile:
la source
plot
commandes? Vous pouvez mettre toutes ces options dans leshist
commandes et seulement deux dans les deux lignes.plot
commande directement dans la commande hist comme je l'ai dit. Publier le code n'est pas à quoi servent les commentaires.Voici une fonction que j'ai écrite qui utilise la pseudo-transparence pour représenter les histogrammes qui se chevauchent
Voici une autre façon de le faire en utilisant le support de R pour les couleurs transparentes
Les résultats finissent par ressembler à ceci:
la source
postscript
)Déjà de belles réponses sont là, mais j'ai pensé à les ajouter. Cela me semble correct. (Copie des nombres aléatoires de @Dirk).
library(scales)
est nécessaire`Le résultat est...
Mise à jour: Cette fonction de chevauchement peut également être utile à certains.
Je pense que le résultat
hist0
est plus joli à regarder quehist
Le résultat de
est
la source
Voici un exemple de la façon dont vous pouvez le faire dans les graphiques R "classiques":
Le seul problème avec cela est qu'il semble beaucoup mieux si les sauts d'histogramme sont alignés, ce qui peut devoir être fait manuellement (dans les arguments passés à
hist
).la source
ggplot
) qui explique directement si vos deux histogrammes ont des tailles d'échantillon sensiblement différentes.breaks=seq(min(data$some_property), max(data$some_property), by=(max_prop - min_prop)/20)
Voici la version comme celle de ggplot2 que j'ai donnée uniquement en base R. J'en ai copié de @nullglob.
générer les données
Vous n'avez pas besoin de le mettre dans un bloc de données comme avec ggplot2. L'inconvénient de cette méthode est que vous devez écrire beaucoup plus de détails sur l'intrigue. L'avantage est que vous avez le contrôle sur plus de détails de l'intrigue.
la source
@Dirk Eddelbuettel: L'idée de base est excellente mais le code tel qu'illustré peut être amélioré. [Prend beaucoup de temps à expliquer, d'où une réponse séparée et non un commentaire.]
La
hist()
fonction dessine par défaut des tracés, vous devez donc ajouter l'plot=FALSE
option. De plus, il est plus clair d'établir la zone de tracé par unplot(0,0,type="n",...)
appel dans lequel vous pouvez ajouter les étiquettes d'axe, le titre du tracé, etc. Enfin, je voudrais mentionner que l'on pourrait également utiliser un ombrage pour distinguer les deux histogrammes. Voici le code:Et voici le résultat (un peu trop large à cause de RStudio :-)):
la source
postscript
appareils.L'API R de Plotly pourrait vous être utile. Le graphique ci-dessous est ici .
Divulgation complète: je fais partie de l'équipe.
la source
Tant de bonnes réponses, mais comme je viens d'écrire une fonction function (
plotMultipleHistograms()
) pour ce faire, j'ai pensé ajouter une autre réponse.L'avantage de cette fonction est qu'elle définit automatiquement les limites d'axe X et Y appropriées et définit un ensemble commun de casiers qu'elle utilise dans toutes les distributions.
Voici comment l'utiliser:
La
plotMultipleHistograms()
fonction peut prendre un certain nombre de distributions et tous les paramètres généraux complotant doit travailler avec elle (par exemple:las
,main
, etc.).la source