web-dev-qa-db-fra.com

histogramme empilé pour deux ensembles de données - Excel

Je suis nouveau ici, même si je parcourais déjà plusieurs fois le blog.

Je me demande s'il existe un moyen (également à l'aide de VBA, si nécessaire) de créer un histogramme empilé affichant deux ensembles de données différents dans MS Excel 2016. 

En regardant autour de moi, j'ai vu que la même question recevait une réponse positive lorsque je travaillais avec Google Charts (voici le fil le graphique en colonnes empilées pour deux ensembles de données - Google Charts )

En gros, j'ai deux tableaux sur 2 pays avec des données mensuelles pour différentes années. Échantillon:

 Excel sheet sample

La sortie que je veux est de montrer les années sur l'axe horizontal et d'avoir un pays représenté dans une colonne empilée qui empile les données mensuelles du côté de la colonne de l'autre pays (comme le graphique créé à l'aide de Google Charts, comme expliqué). dans le le fil lié au dessus .

La solution devrait ressembler à cet exemple:

 wanted solution

Je n'ai pas trouvé de réponse à cette question. Pouvez-vous m'aider à résoudre ce problème?

Veuillez également noter que je possède des compétences de base en VBA, c’est-à-dire que je peux plus ou moins comprendre un code lorsque je le lis, mais je ne suis pas capable de l’écrire moi-même.

Merci beaucoup à tous

4
Ema

Utilisez simplement le graphique à barres empilées normal. Si vous souhaitez regrouper les piles, laissez des colonnes vides dans votre tableau:

 enter image description here

Avec un peu de formatage, vous pouvez obtenir presque exactement ce que vous avez. La seule partie qui serait difficile serait d’obtenir les étiquettes d’année comme axe horizontal secondaire. Pour ce faire, je viens de créer une autre série de tous les 0 avec les années comme étiquettes et de l'ajouter comme axe secondaire (ajouter un axe horizontal secondaire également), puis de choisir sur l'axe vertical secondaire de le faire valeur 0. Après une mise en forme, vous pouvez obtenir exactement ce que vous voulez:

 enter image description here

Pas besoin de VBA et certainement pas besoin de JavaScript!

0
Dan

Je vois que vous avez lié une question de stackoverflow où ils utilisent javascript pour créer un graphique avec des graphiques Google. Je pense que ce langage est le meilleur moyen de créer des graphiques complexes comme le vôtre.

Vous avez mentionné que vos compétences de codage n'étaient pas bonnes dans vba, je ne sais pas si c'est la même chose que javascript, mais je vais essayer de décrire mon code du mieux que je peux.

Voici un code de travail que j'ai écrit pour vous:

https://www.funfun.io/1/#/edit/5a73067991f44418b7b84218

Comme vous pouvez le constater, pour utiliser cet exemple, j’ai utilisé un éditeur en ligne avec une feuille de calcul incorporée. J'y entre mes données et j'y accède avec mon code à l'aide d'un fichier JSON, il s'agit du fichier short situé sous Settings:

{
    "data": "=A1:D27"
}

Une fois que j’ai accès à mes données, je les stocke dans des variables locales. Vous pouvez le voir dans le fichier script.js. J'ai écrit quelques commentaires pour que vous sachiez quelle variable est quoi. Je vais jeter mes données avec $internal.data, c’est là que les données de la feuille de calcul sont stockées de la colonne A à D, lignes 1 à 27:

for (var i = 0; i < $internal.data.length; i++) // $internal.data.length = 27 in this example
{
  if (i == 0 || i == 14) {
    country.Push($internal.data[i][0]);
    continue;
  }
  if (i > 0 && i < 13) {
    months.Push($internal.data[i][0]); // months
    dataA.Push(
      [
        parseInt($internal.data[i][1]), // value 2015 countryA
        parseInt($internal.data[i][2]), // value 2016 countryA
        parseInt($internal.data[i][3]) // value 2017 countryA
      ]);
  }
  if (i > 13 && i < 27) {
    dataB.Push(
      [
        parseInt($internal.data[i][1]), // value 2015 countryB
        parseInt($internal.data[i][2]), // value 2016 countryB
        parseInt($internal.data[i][3])  // value 2017 countryB
      ]);
  }
}

Après avoir correctement stocké mes données, je peux créer mon graphique avec une bibliothèque javascript. J'ai utilisé Highcharts (assez similaire à Google charts). Il contient un bon { documentation } _ avec beaucoup de exemples .

Je mets toutes les données et quelques options dans une variable de série qui utilise le format des graphiques en haut, comme ceci:

 var series = [];
  // We enter the data we need in series
  for(var i = 0; i < months.length; i++) {
    series.Push({
        name: months[i] + " " + country[0],
        type: 'column',
        color: Highcharts.getOptions().colors[i+7],
        data: dataA[i],
        stack: country[0] // country A
    });
    series.Push({
        name: months[i] + " " + country[1],
        type: 'column',
        color: Highcharts.getOptions().colors[i+7],
        data: dataB[i],
      stack: country[1] //country B
    });        
  }

...
// we enter series in the highchart chart
    series: series

Je différencie les deux pays en attribuant une valeur différente à la variable stack. Cette variable me permet de créer un histogramme empilé avec plusieurs barres portant le même libellé d'axe.

Une fois cela fait, vous obtenez un tableau comme celui-ci:

all labels

Si vous ne voulez pas afficher tous les mois, vous pouvez cliquer sur les étiquettes des mois que vous ne voulez pas et le message disparaîtra, comme ceci:

few labels

Une fois que vous avez créé votre graphique, vous pouvez le charger dans Excel à l’aide d’un complément Excel appelé Funfun . Il vous suffit de coller l’URL de l’éditeur en ligne dans le complément. Voici à quoi cela ressemble avec mon exemple:

final

Vous pouvez ensuite enregistrer le graphique dans un format différent en cliquant sur en haut à droite du graphique:

save chart

J'espère que cela aide, si je n'ai pas été clair dans mon explication, n'hésitez pas à commenter :)

Divulgation: Je suis un développeur de Funfun.

1
nicolas dejean