Creer un graphique avec plusieurs courbes en VBA
Bonjour tout le monde !
Je voudrais créer une fonction (et non une procédure) qui permettrait de créer un histogramme ou une courbe de densité en fonction des données que l'on lui passe en argument. Je voudrais aussi que cette fonction affiche sur le même graphique la densité de la loi normale (c'est donc celle ci la deuxième courbe). J'aimerais éviter de spécifier un setSourceData car je ne veux pas de plage de données fixes. Je voudrais que cette fonction on puisse l’appeler n'importe ou et que l'on lui passe en arguments la plage de données et hop elle retourne nos histogramme. Je joins ci dessous ma fonction que j'ai commencé à coder. Pour l moment elle prend comme argument des données, et des paramètres optionnel qui sont barplot = true si on veut un graphique en bars ou false si on veut une courbe, et data_display = true si on veut que la fonction retourne un tableau avec dans une première colonne les intervalles des fréquences et dans la secondes les fréquences associées.
Public Function Hist(data As Variant, Optional barplot As Boolean = True, Optional data_display As Boolean = False)
' This function take data (returns for example) and display in a graph
' the empirical density distribution.
' We use the La Rice law for creating classes.
Dim n As Integer
n = length(data)
Dim nb_block As Integer
nb_block = 2 * Sqr(n)
Dim data_sorted As Variant
data_sorted = Application.WorksheetFunction.Sort(data)
Dim size As Double
size = (data_sorted(n, 1) - data_sorted(1, 1)) / nb_block
' Here we fill a table with the frequency and the corresponding data path.
Dim i As Double, histogram(), count As Integer
ReDim histogram(1 To nb_block, 1 To 1)
count = 1
For i = data_sorted(1, 1) To data_sorted(n, 1) Step size
histogram(count, 1) = i + size
count = count + 1
Next i
Dim V_frequency As Variant
V_frequency = Application.WorksheetFunction.frequency(data_sorted, histogram)
' we remove the last element, because frequency function calculate
'the frequency between ith element until i + 1 element. So it will return
' the frequency beyond the last observations. So it will be zero.
V_frequency = remove(V_frequency)
' Here we display in a graph the frequency and the corresponding data paths.
Dim j As Integer
' Here we calcul the frequency in percent
For j = 1 To nb_block
V_frequency(j, 1) = (V_frequency(j, 1) / n) * 100
Next j
Dim feuille As Worksheet
Dim Graphique As ChartObject
Set feuille = Sheets("Feuil1")
Set Graphique = feuille.ChartObjects.add(60, 50, 500, 300)
With Graphique.Chart
If barplot Then
.ChartType = xlColumnClustered ' create a barplot
Else
.ChartType = xlXYScatterLinesNoMarkers ' create a line plot
End If
.SeriesCollection.NewSeries
.HasTitle = True
.ChartTitle.Text = "Histogram of density"
With .SeriesCollection(1)
.Values = V_frequency
.XValues = histogram
End With
End With
Set Graphique = Nothing
Set feuille = Nothing
' If the boolean display_data = true, so we return in a table
' the intervals with the corresponding frequency.
If data_display Then
Dim data_table()
ReDim data_table(1 To (nb_block + 1), 1 To 2)
' we give in the first line the corresponding names
data_table(1, 1) = "intervals"
data_table(1, 2) = "frequency"
For j = 1 To nb_block
data_table(j + 1, 1) = histogram(j, 1)
data_table(j + 1, 2) = V_frequency(j, 1)
Next j
Hist = data_table
End If
End Function
Pour le moment m'a fonction marche bien elle retourne mon histogramme en bar ou en ligne en fonction du paramètre choisi. Mais je ne sais pas comment lui dire que je voudrais ajouter en plus une autre courbe. Je voudrais génerer des nombres aléatoires suivant une loi normale puis calculer la fréquence de manière empirique et afficher une courbe (rouge par example) afin de pouvoir comparer les deux densités.
Je vous remercie par avance :)
bonjour,
formule pour générer une donnée aléatoire suivant une loi normale (de moyenne m (A1) et d'écart type s(A2)) (à répéter autant de fois que de données souhaitées)
=LOI.NORMALE.INVERSE.N(ALEA();$A$1;$A$2)
ou pour une utilisation en VBA avec .formula
=NORM.INV(RAND(),$A$1,$A$2)
merci H2so4 mais générer des nombres aléatoires suivant une loi normale me pose aucun problème. Je voudrais savoir comment créer un graphique à plusieurs courbes à partir d'un tableau (et non d'une plage de cellules).