Jean-Michel Le Bot | 1 Feb 14:22
Picon

inverse de mls.eclate.multi ?

Bonjour
Existe-t-il une fonction qui ferait l'inverse de mls.eclate.multi ou 
sinon comment l'écrire ?
Ce que je voudrais faire est un tri à plat "à la Modalisa" (% de 
réponses et/ou de répondants) à partir d'une question à réponses 
multiples déjà dichotomisée par Limesurvey en autant de questions 
binaires que de modalités (ce que fait si je comprends bien 
mls.table.multi, mais à partir du format d'export de ces questions par 
Modalisa).
Merci
-- 
J e a n  -  M i c h e l   L e  B o t
Maître de conférences de sociologie
Université Rennes 2 - Département AES
Place du recteur Henri Le Moal
CS 24307
35043 Rennes Cedex
Chercheur au LAS/LARES (Université Rennes 2)
http://www.univ-rennes2.fr/las/
Tél. (33) 02 23 46 14 70

--

-- 
Liste des utilisateurs de R en sciences sociales
Informations / options / désabonnement :
https://listes.cru.fr/sympa/info/r-soc

Gaël Laurans | 2 Feb 12:20
Picon

Re: inverse de mls.eclate.multi ?

On Feb 1, 2012, at 2:22 PM, Jean-Michel Le Bot wrote:

> Bonjour
> Existe-t-il une fonction qui ferait l'inverse de mls.eclate.multi ou  
> sinon comment l'écrire ?
> Ce que je voudrais faire est un tri à plat "à la Modalisa" (% de  
> réponses et/ou de répondants) à partir d'une question à réponses  
> multiples déjà dichotomisée par Limesurvey en autant de questions  
> binaires que de modalités (ce que fait si je comprends bien  
> mls.table.multi, mais à partir du format d'export de ces questions  
> par Modalisa).

Si j'ai bien compris la question (je n'utilise pas Modalisa), le code  
suivant devrait faire l'affaire. En fonction du format des données  
fournies par limesurvey, il sera peut-être nécessaire de l'adapter.

# Réponses dichotomisées, pour illustration
repA <- c(1,1,1,0)
repB <- c(0,0,1,0)
repC <- c(1,1,1,1)
df <- data.frame(repA, repB, repC)

# Calcul du nombre total de réponses
total <- sum(df[,1:3])

# Tri à plat
apply(df[,1:3], 2, function(x) {sum(x)/total})

Apply permet d'appliquer une fonction ligne-par-ligne ou colonne-par- 
colonne (le paramètre 2 signifie colonne). La fonction en question est  
(Continue reading)

Pierre de Larminat | 3 Feb 17:20
Picon

Superposer un histogramme, une courbe et leurs étiquettes

Bonjour à toutes et à tous,
Quelqu'un saurait-il faire le graphique ci-joint?
On y trouve le "nombre" en histogramme, avec les valeurs numériques en étiquettes,
et le "volume" en courbe (comme un "plot" de type "b"), avec aussi les valeurs numériques en étiquettes.

Dans un monde idéal, "volume" et "nombre" seraient représentés avec des couleurs différentes.

#Voici les données:
annee<-factor(2003:2010)
nombre<-c(441061431151301068589)
volume<-c(6.822.714.610.826.918.219.430.5)
data<-data.frame(anneenombrevolume
str(data)
data

#Voici ma tentative sur la première partie du graphique:
nombre<-data$nombre
names(nombre) <- data$annee
bar<-barplot(nombreylim = c(0max(nombre)*1.2))
text(barnombre+3labels = nombre)

# Pour la suite, mes tentatives restent infructueuses.

Merci.
Pierre.

--

-- 
Liste des utilisateurs de R en sciences sociales
Informations / options / désabonnement :
https://listes.cru.fr/sympa/info/r-soc

Pierre de Larminat | 3 Feb 17:21
Picon

Re: Superposer un histogramme, une courbe et leurs étiquettes

Avec la photo du graphique recherché:

Le 3 févr. 2012 à 17:20, Pierre de Larminat a écrit :

> Bonjour à toutes et à tous,
> Quelqu'un saurait-il faire le graphique ci-joint?
> On y trouve le "nombre" en histogramme, avec les valeurs numériques en étiquettes,
> et le "volume" en courbe (comme un "plot" de type "b"), avec aussi les valeurs numériques en étiquettes.
> 
> Dans un monde idéal, "volume" et "nombre" seraient représentés avec des couleurs différentes.
> 
> #Voici les données:
> annee<-factor(2003:2010)
> nombre<-c(44, 106, 143, 115, 130, 106, 85, 89)
> volume<-c(6.8, 22.7, 14.6, 10.8, 26.9, 18.2, 19.4, 30.5)
> data<-data.frame(annee, nombre, volume) 
> str(data)
> data
> 
> #Voici ma tentative sur la première partie du graphique:
> nombre<-data$nombre
> names(nombre) <- data$annee
> bar<-barplot(nombre, ylim = c(0, max(nombre)*1.2))
> text(bar, nombre+3, labels = nombre)
> 
> # Pour la suite, mes tentatives restent infructueuses.
> 
> Merci.
> Pierre.


--

-- 
Liste des utilisateurs de R en sciences sociales
Informations / options / désabonnement :
https://listes.cru.fr/sympa/info/r-soc

Etienne Ollion | 3 Feb 18:23
Picon

Re: Superposer un histogramme, une courbe et leurs étiquettes

Salut Pierre, 

Que dis tu de cela? 
C'est un peu plus complexe que le plot de base, mais c'est plus élégant et ca reste faisable. 
En gros, deux choses ont changé: 
- j'ai supprimé l'axe des abscisses (xaxt="n"), et je l'ai refait (tu peux faire pareil avec y)
- j'ai fait une boucle pour imprimer le texte 
Mais  tu peux te dispenser de ces finitions

L'autre solution pour superposer,  ce serait ggplot, mais c'est un peu plus dur au début. 
Surtout, je pense que ca irait plus vite avec Excel (...) 

A tres bientôt!
etienne

plot (data[,1], data[,2], ylim=c(0,175), type="h", xlab="", ylab="", lwd=35, col="lightblue",
main="Le graphique de Pierre", xaxt="n")
lines(data[,1], data[,3], type="l", col="darkred", lwd=2, lty=2)
grid()
axis(side=1, at=c(2003:2010), tck=-0.015, labels=FALSE)
text(c(2003:2010), par("usr")[3]-10, srt=45, adj=1, labels=c(2003:2010),xpd=T, cex=0.85)
mtext("Valeur de plouf de 2003 à 2010", side=3, line=.5, cex=.85)
mtext("Sources=Ploufplouf", side=1, line=3.5, cex=.65)
for (i in c(1:8)) {
text (2002+i, data[i,3]+8, data[i,3], cex=.75, col="darkgrey")
text (2002+i, data[i,2]+15, data[i,2], cex=.75)
}
Attachment (PierrotGraph.pdf): application/pdf, 196 KiB

On Feb 3, 2012, at 5:20 PM, Pierre de Larminat wrote:

> Bonjour à toutes et à tous,
> Quelqu'un saurait-il faire le graphique ci-joint?
> On y trouve le "nombre" en histogramme, avec les valeurs numériques en étiquettes,
> et le "volume" en courbe (comme un "plot" de type "b"), avec aussi les valeurs numériques en étiquettes.
> 
> Dans un monde idéal, "volume" et "nombre" seraient représentés avec des couleurs différentes.
> 
> #Voici les données:
> annee<-factor(2003:2010)
> nombre<-c(44, 106, 143, 115, 130, 106, 85, 89)
> volume<-c(6.8, 22.7, 14.6, 10.8, 26.9, 18.2, 19.4, 30.5)
> data<-data.frame(annee, nombre, volume) 
> str(data)
> data
> 
> #Voici ma tentative sur la première partie du graphique:
> nombre<-data$nombre
> names(nombre) <- data$annee
> bar<-barplot(nombre, ylim = c(0, max(nombre)*1.2))
> text(bar, nombre+3, labels = nombre)
> 
> # Pour la suite, mes tentatives restent infructueuses.
> 
> Merci.
> Pierre.
> 
> -- 
> Liste des utilisateurs de R en sciences sociales
> Informations / options / désabonnement :
> https://listes.cru.fr/sympa/info/r-soc
> 


--

-- 
Liste des utilisateurs de R en sciences sociales
Informations / options / désabonnement :
https://listes.cru.fr/sympa/info/r-soc

Etienne Ollion | 3 Feb 22:51
Picon

Re: Re: Superposer un histogramme, une courbe et leurs étiquettes

Pardon, je n'avais pas vu que tu voulais une double échelle (à mon avis, à proscrire car ca induit souvent
en erreur, mais bon). 
Tiens, voilà le schéma commenté. Mais encore une fois: excel + photoshop... 
Attachment (Pierre2.R): application/octet-stream, 1361 bytes

Attachment (Pierre2.pdf): application/pdf, 241 KiB

op = par(cex.axis = .75)
# Premier graphique: les barres
plot (data[,1], data[,2], ylim=c(0,175), type="h", xlab="", ylab="", lwd=15, col="lightblue",
main="Le graphique de Pierre", xaxt="n", yaxt="n", bg="grey")
# Le quadrillage
grid()
# Les axes x et y
axis(side=1, at=c(2003:2010), tck=-0.015, labels=FALSE)
text(c(2003:2010), par("usr")[3]-10, srt=45, adj=1, labels=c(2003:2010),xpd=T, cex=0.85)
axis(side=2, at=seq(0,150, by=50), tck=-0.015, labels=c("0","50", "100", "150"), las=1, cex=.5)
# Les titres
mtext("Valeur de plouf de 2003 à 2010", side=3, line=.5, cex=.85)
mtext("Sources=Plouf/plouf", side=1, line=3.5, cex=.65)
# La boucle pour les étiquettes
for (i in c(1:8)) {
text (2002+i, data[i,2]+11, data[i,2], cex=.65)
}
# Appelle un nouveau graphique (superpose)
par(new=T)
op = par(cex.axis = .7)
plot(data[,1], data[,3], type="o",col="darkred",yaxt="n", lty=3, xaxt="n", xlab="", ylab="",
xlim=c(2003,2010), ylim=c(0,35)) 
axis(side=4, at=seq(0,35, by=5), tck=-0.015, labels=c("0","5", "10", "15", "20", "25", "30", "35"), las=1)
par(op)
for (i in c(1:8)) {
text (2002+i, data[i,3]-2, data[i,3], col="darkred",cex=.5)
}
par(op)

On Feb 3, 2012, at 5:21 PM, Pierre de Larminat wrote:

> Avec la photo du graphique recherché:
> <graphique.pdf>
> 
> Le 3 févr. 2012 à 17:20, Pierre de Larminat a écrit :
> 
>> Bonjour à toutes et à tous,
>> Quelqu'un saurait-il faire le graphique ci-joint?
>> On y trouve le "nombre" en histogramme, avec les valeurs numériques en étiquettes,
>> et le "volume" en courbe (comme un "plot" de type "b"), avec aussi les valeurs numériques en étiquettes.
>> 
>> Dans un monde idéal, "volume" et "nombre" seraient représentés avec des couleurs différentes.
>> 
>> #Voici les données:
>> annee<-factor(2003:2010)
>> nombre<-c(44, 106, 143, 115, 130, 106, 85, 89)
>> volume<-c(6.8, 22.7, 14.6, 10.8, 26.9, 18.2, 19.4, 30.5)
>> data<-data.frame(annee, nombre, volume) 
>> str(data)
>> data
>> 
>> #Voici ma tentative sur la première partie du graphique:
>> nombre<-data$nombre
>> names(nombre) <- data$annee
>> bar<-barplot(nombre, ylim = c(0, max(nombre)*1.2))
>> text(bar, nombre+3, labels = nombre)
>> 
>> # Pour la suite, mes tentatives restent infructueuses.
>> 
>> Merci.
>> Pierre.
> 
> 
> -- 
> Liste des utilisateurs de R en sciences sociales
> Informations / options / désabonnement :
> https://listes.cru.fr/sympa/info/r-soc
> 


--

-- 
Liste des utilisateurs de R en sciences sociales
Informations / options / désabonnement :
https://listes.cru.fr/sympa/info/r-soc

Gaël Laurans | 3 Feb 23:14
Picon

Re: Superposer un histogramme, une courbe et leurs étiquettes


On Feb 3, 2012, at 6:23 PM, Etienne Ollion wrote:

> Salut Pierre,
>
> Que dis tu de cela?
> C'est un peu plus complexe que le plot de base, mais c'est plus  
> élégant et ca reste faisable.
> En gros, deux choses ont changé:
> - j'ai supprimé l'axe des abscisses (xaxt="n"), et je l'ai refait  
> (tu peux faire pareil avec y)
> - j'ai fait une boucle pour imprimer le texte
> Mais  tu peux te dispenser de ces finitions
>
> L'autre solution pour superposer,  ce serait ggplot, mais c'est un  
> peu plus dur au début.
> Surtout, je pense que ca irait plus vite avec Excel (...)

Voilà une solution avec ggplot

ggplot(data, aes(x=annee)) +
	geom_bar(aes(y=nombre)) +
	# +3 pour ajuster la position et éviter que le texte des étiquette  
morde sur les barres
	geom_text(aes(y=(nombre + 3), label=nombre)) +

	geom_point(aes(y=volume), colour="red") +
	# Le group=1 sert à indiquer que tous les points font partie d'un  
seul groupe (sinon, ggplot utilise automatiquement la variable  
catégorielle annee, considère chaque point comme un groupe séparé et  
ne produit aucune ligne)
	geom_line(aes(y=volume, group=1), linetype=2, colour="red") +
	# Le vecteur est un truc pour ajuster la position des étiquettes une  
par une
	geom_text(aes(y=volume + c(5,3,4,-4,3,-4,-4,4), label=volume),  
colour="red")

Il n'est pas possible de créer une double échelle avec ggplot (entre  
autre parce que c'est généralement une mauvaise idée) et Hadley  
Wickham a expliqué il y a un an ou deux qu'il ne le sera jamais.

Gaël

--

-- 
Liste des utilisateurs de R en sciences sociales
Informations / options / désabonnement :
https://listes.cru.fr/sympa/info/r-soc

Emiliano Grossman | 4 Feb 19:26
Picon

exclusion de multiples observations

Bonjour, 


j'ai un jeu de données avec les scores de certains partis aux élections dans une variété de pays (chaque ligne représente un parti dans un pays dans une élection). 
Or la moitié de ces pays ne m'intéressent pas. Je voudrais donc les exclure, ce que je fais d'habitude avec

data2<-data[which(country!="countryname"),]

Ma question est la suivante: y aurait-il moyen d'exclure d'un coup dix ou vingt pays?
Ce que je fais actuellement, c'est que rajoute une ligne pour chaque pays que je veux exclure. Et ça me dérange pas de continuer à le faire. Je me demande juste s'il y a un moyen plus simple / élégant de le faire. 

bien à vous,


--

-- 
Liste des utilisateurs de R en sciences sociales
Informations / options / désabonnement :
https://listes.cru.fr/sympa/info/r-soc

Julien Barnier | 4 Feb 22:58
Picon
Picon

Re: exclusion de multiples observations

Bonjour,

> data2<-data[which(country!="countryname"),]
>
> Ma question est la suivante: y aurait-il moyen d'exclure d'un coup
> dix ou vingt pays?
> Ce que je fais actuellement, c'est que rajoute une ligne pour chaque
> pays que je veux exclure. Et ça me dérange pas de continuer à le
> faire. Je me demande juste s'il y a un moyen plus simple / élégant de
> le faire. 

Éventuellement utiliser %in%, mais ça ne change pas forcément grand chose :

exclude.countries <- c("country1", "country2", "country3")
data2 <- data[!(data$country %in% exclude.countries),]

Cordialement,

Julien Barnier


--

-- 
Liste des utilisateurs de R en sciences sociales
Informations / options / désabonnement :
https://listes.cru.fr/sympa/info/r-soc

Pierre de Larminat | 6 Feb 15:11
Picon

Re: Superposer un histogramme, une courbe et leurs étiquettes

Merci à tous ceux qui m'ont répondu. 
Grâce à vous, non seulement j'ai obtenu ce que je voulais mais j'ai aussi pas mal appris sur R.

Bilan des courses:
1. Bien que la solution d'Étienne permette d'approcher le graphique original avec les fonctions de base, cette solution produit un résultat inexact: la fonction "lwd" de la commande "plot" distord les bâtons du graphique; leur longueur ne correspond plus à la valeur qu'elle est sensée représenter.

2. La solution ggplot proposée par Gaël Laurens est sans doute plus élégante et permet un bon nombre de personnalisations. Surtout, la représentation est correcte.

3. Rémi Sinthon m'a fait remarquer que l'utilisation d'une courbe plutôt que de bâtons pour l'une des deux séries risque d'induire les lecteurs en erreur et de leur faire croire que des valeurs intermédiaires existent entre les points. Aussi, comme l'ont signalé Étienne et Gaël, l'usage d'une double échelle peut prêter à confusion.
Je me suis finalement décidé pour un graphique dédoublé où les séries sont néanmoins superposées d'une certaine manière, ce qui permet toujours d'en comparer l'évolution.

annee<-factor(2003:2010)
nombre<-c(44, 106, 143, 115, 130, 106, 85, 89)
volume<-c(6.8, 22.7, 14.6, 10.8, 26.9, 18.2, 19.4, 30.5)
data<-data.frame(annee, nombre, volume) 
#str(data#data
#1er sous-graphique:
par(fig=c(0,1,0.33,1))
bar<-barplot(data$nombre, ylim=c(0,max(data$nombre)), las=1, col="grey90", ylab="Nombre d'appels d'offres", cex.axis=.8)
text(bar, data$nombre-8, labels=data$nombre)
#2eme sous-graphique:
par(fig=c(0,1,0,0.55), new=TRUE)
vol<-data$volume
names(vol)<-data$annee #En transformant "data$volume" en "vol" et en utilisant "names", j'obtiens les années en abscisse)
bar2<-barplot(vol, ylim=c(0,max(vol)),las=1, col="grey90", ylab="Volumes, en milliards d'euros", cex.axis=.8)
text(bar2, vol-2, labels=vol)
#Fermeture de la fenêtre et retour aux paramètres graphiques d'origine:
dev.off()

J'ai préféré la superposition des graphiques à la juxtaposition des bâtons année par année. Selon moi, cette dernière solution est inadaptée quand on ne compare pas l'évolution de deux séries de même nature (évolution du taux d'emploi de plusieurs populations, par exemple).

Encore merci,
Pierre.


Le 3 févr. 2012 à 23:14, Gaël Laurans a écrit :


On Feb 3, 2012, at 6:23 PM, Etienne Ollion wrote:

Salut Pierre,

Que dis tu de cela?
C'est un peu plus complexe que le plot de base, mais c'est plus élégant et ca reste faisable.
En gros, deux choses ont changé:
- j'ai supprimé l'axe des abscisses (xaxt="n"), et je l'ai refait (tu peux faire pareil avec y)
- j'ai fait une boucle pour imprimer le texte
Mais  tu peux te dispenser de ces finitions

L'autre solution pour superposer,  ce serait ggplot, mais c'est un peu plus dur au début.
Surtout, je pense que ca irait plus vite avec Excel (...)

Voilà une solution avec ggplot

ggplot(data, aes(x=annee)) +
geom_bar(aes(y=nombre)) +
# +3 pour ajuster la position et éviter que le texte des étiquette morde sur les barres
geom_text(aes(y=(nombre + 3), label=nombre)) +

geom_point(aes(y=volume), colour="red") +
# Le group=1 sert à indiquer que tous les points font partie d'un seul groupe (sinon, ggplot utilise automatiquement la variable catégorielle annee, considère chaque point comme un groupe séparé et ne produit aucune ligne)
geom_line(aes(y=volume, group=1), linetype=2, colour="red") +
# Le vecteur est un truc pour ajuster la position des étiquettes une par une
geom_text(aes(y=volume + c(5,3,4,-4,3,-4,-4,4), label=volume), colour="red")

Il n'est pas possible de créer une double échelle avec ggplot (entre autre parce que c'est généralement une mauvaise idée) et Hadley Wickham a expliqué il y a un an ou deux qu'il ne le sera jamais.

Gaël

--
Liste des utilisateurs de R en sciences sociales
Informations / options / désabonnement :
https://listes.cru.fr/sympa/info/r-soc



--

-- 
Liste des utilisateurs de R en sciences sociales
Informations / options / désabonnement :
https://listes.cru.fr/sympa/info/r-soc


Gmane