D3 Bibliothèque — Comment Accéder À des Données JSON dans cet exemple
Je n'ai pas à expliquer le problème correctement dans le titre... Désolé.
Je suis à la suite de la D3 Tag Cloud Simple exemple
https://github.com/jasondavies/d3-cloud/blob/master/examples/simple.html
J'ai un fichier JSON qui se compose de tweet balises, sentimental, les valeurs et les tweet de texte;
(extrait)
var words = [{"word":"disgrace","sentiment":"0.975","tweet":"Wheres Fred the weatherman? \nIn jail #disgrace #dirtyman @MrJimmyCorkhill"},{"word":"dirtyman","sentiment":"0.975","tweet":"Wheres Fred the weatherman? \nIn jail #disgrace #dirtyman @MrJimmyCorkhill"}];
Je veux utiliser le "tweet" de la valeur en tant que "titre" de chaque "texte" de l'élément.
J'ai essayé de faire cela en mettant mon tweet dans le .les mots de fonction (ou de .carte, je ne sais pas :s), que d'autres données est accessible de cette façon, mais je ne peux pas extraire mon 'tweet' données;
var fill = d3.scale.category20();
var words = <?php echo $tweets->getTweetTags(); ?>;
d3.layout.cloud().size([1000, 1000])
.words(words.map(function(d) {
return {text: d.word, size: d.sentiment * 40, tweet: d.tweet};
}))
.rotate(function() { return ~~(Math.random() * 2) * Math.random() * 1; })
.font("Impact")
.fontSize(function(d) { return d.size; })
.on("end", draw)
.start();
function draw(words) {
d3.select("#vis").append("svg")
.attr("width", 1000)
.attr("height", 1000)
.append("g")
.attr("transform", "translate(500,400)")
.selectAll("text")
.data(words)
.enter().append("text")
.style("font-size", function(d) { return d.size + "px"; })
.style("font-family", "Impact")
.style("fill", function(d, i) { return fill(i); })
.attr("text-anchor", "middle")
.attr("transform", function(d) {
return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
})
.text(function(d) { return d.text; })
.append("svg:title").text(function(d) { return d.tweet; } );
}
d.tweet renvoie undefined
Je peux sans doute comprendre pourquoi je ne peux pas utiliser mon tweet dans le .des mots ou des .carte de fonction, comme ils ne s'attendent à certains paramètres, mais je ne sais pas comment pour obtenir le 'tweet' données dans le titre, les balises de chaque "texte" de l'élément.
Quelqu'un peut-il m'aider?
Edit: Code avec l'intérieur de la d3.json fonction;
var data; //a global
d3.json("../../../assets/json/tweetTags.json", function(error, json) {
if (error) return console.warn(error);
data = json;
var fill = d3.scale.category20();
d3.layout.cloud().size([1000, 1000])
.words(data.map(function(d) {
return {text: d.word, size: d.sentiment * 40, tweet: d.tweet};
}))
.rotate(function() { return ~~(Math.random() * 2) * Math.random() * 1; })
.font("Impact")
.fontSize(function(d) { return d.size; })
.on("end", draw)
.start();
function draw(data) {
d3.select("#vis").append("svg")
.attr("width", 1000)
.attr("height", 1000)
.append("g")
.attr("transform", "translate(500,400)")
.selectAll("text")
.data(words)
.enter().append("text")
.style("font-size", function(d) { return d.size + "px"; })
.style("font-family", "Impact")
.style("fill", function(d, i) { return fill(i); })
.attr("text-anchor", "middle")
.attr("transform", function(d) {
return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
})
.text(function(d) { return d.text; })
.append("svg:title").text(function(d) { return d.tweet; } );
}
d3.layout.cloud().size([300, 300])
.data.map(function(d) {
return {text: d, size: 10 + Math.random() * 90};
})
.rotate(function() { return ~~(Math.random() * 2) * 90; })
.font("Impact")
.fontSize(function(d) { return d.size; })
.on("end", draw)
.start();
});
Je ne sais pas comment le faire fonctionner comme ça. J'ai fait le fichier json, mais maintenant je ne peux pas accéder aux données ou d'exécuter le nuage.
Edit: Les éléments de texte sont en ajoutant à l'extérieur de la balise body de clôture maintenant 🙁
var data; //a global
d3.json("../../../assets/json/tweetTags.json", function(error, json) {
if (error) return console.warn(error);
data = json;
var fill = d3.scale.category20();
d3.select("#vis").append("svg")
.attr("width", 1000)
.attr("height", 1000)
.append("g")
.attr("transform", "translate(500,400)")
.data(json)
.enter().append("text")
.style("font-size", function(d) { return d.sentiment * 40 + "px"; })
.style("font-family", "Impact")
.style("fill", function(d, i) { return fill(i); })
.text(function(d) {return d.word;})
.append("svg:title").text(function(d) { return d.tweet; } );
});
Edit: @Chris C'est votre exampled code de la D3 json fonction et avec mes personnalisations
d3.json("../../../assets/json/tweetTags.json", function(error, json) {
if (error) return console.warn(error);
var fill = d3.scale.category20();
d3.layout.cloud().size([600, 500])
.words(json.map(function(d) {;
return {text: d.word, size: d.sentiment * 40, tweet: d.tweet};
}))
.rotate(function(d) { return ~~(Math.random() * 2) * 90; })
.font("Impact")
.fontSize(function(d) { return d.size; })
.on("end", draw)
.start();
function draw(words) {
d3.select("body").append("svg")
.attr("width", 600).attr("height", 500)
.append("g").attr("transform", "translate(350,350)")
.selectAll("text").data(words)
.enter().append("text")
.style("font-size", function(d) { return d.size + "px"; })
.style("font-family", "Impact")
.style("fill", function(d, i) { return fill(i); })
.attr("text-anchor", "middle")
.attr("transform", function(d) {
return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
})
.text(function(d) { return d.text; }).append("svg:title")
.text(function(d) { return d.tweet; } );
}
})
Mais je ne peux pas accéder à d.tweet de la fonction draw :s
OriginalL'auteur user1977072 | 2013-01-21
Vous devez vous connecter pour publier un commentaire.
Je vous suggérons d'utiliser le haut- fonction d'importation de json au lieu de php. Je pense que le problème que vous avez est que la lecture des données est asynchrone,
words
n'est pas rempli avant de l'utiliser dans les nuages.Le principe derrière
d3.json()
est de tout faire dans cette fonction, qui sera exécuté lorsque le json est chargé:MODIFIER
Voici un exemple de code qui devrait fonctionner, j'ai juste ajouté le d3 nuage exemple à l'intérieur de la fonction json.
Puis, quand cette version fonctionne, vous pouvez simplement remplacer le
.words()
par:Eh bien pour cela, je ne peux que vous conseiller de commencer avec quelque chose de simple et ajoutez ensuite les options pour obtenir le résultat souhaité. Premier indice, pourquoi tirez-vous des deux nuages? Mais si le problème n'est plus avec le json, vous devriez demander à d'autres questions. Essayez toujours d'avoir le plus simple (et la plus courte) code de la possibilité d'illustrer votre problème, il conduit souvent à la résolution de votre problème par vous-même.
Ouais c'deuxième nuage en bas, c'est une erreur. Je vais passer plus de temps à la recherche dans le problème; c'est juste que vous étaient disponibles et je n'ai pas envie de jeter de soutien par ne pas précipiter les choses.
J'ai édité mon code, maintenant, il devrait vous donner tous les détails.
J'ai utilisé votre code et customisé, mais éprouve de la question d'origine n'étant pas en mesure d'accéder le tweet de données à partir de la fonction draw (voir modifier ci-dessus - Edit: @Chris)
OriginalL'auteur Christopher Chiche
Pouvez-vous extraire d'autres entrées de vos données? par exemple, les mots et les sentiments?
Peut-être que vous pourriez essayer comme code suivant. Si cela fonctionne, vous pouvez le modifier à votre codes.
Donc, je pense que vous pouvez le modifier pour répondre à vos exigences.Vous avez essayé d'utiliser des mots.map(function(d){...}) est un petit problème. Cause de la variable des "mots" est juste un Objet normal, il n'a pas de carte en fonction de son prototype, je pense. C'est un plaisir de vous aider.
Vraiment bonne aide Lephix (pas d'actualisation de l'aide de Chris), mais je ne sais pas comment faire pour comprendre pourquoi mon texte " les éléments sont en ajoutant à l'extérieur de l' '/body' de l'élément snag.gy/ktb5h.jpg
J'ai édité la cove (voir 2ème édition ci-dessus) pour ce problème.
Peut-être que vous devriez re-sélectionner l'élément avant d'entrer() nouvel élément en elle. Par exemple: d3.sélectionnez("svg > g").de données(json).append("texte").....
OriginalL'auteur lephix
J'ai eu exactement le même problème avec les mots de sortir du conteneur svg et je l'ai résolu par l'insertion d'une variable appelée origine que j'ai mis pour (largeur/2) dans la méthode translate. La frontière problèmes ont été causés par le fait que le alghorithm est de les garder à l'intérieur aussi longtemps que vous utilisez le bon centre de ot de la projection du champ par exemple: width=300, height=300, qui signifie origine=150. J'espère que vous aide.
OriginalL'auteur Igorovsky