Courbe + courbe de tendance + linéarisation partielle même graphique
Bonjour,
Je souhaite afficher sur un même graphique :
-Une première courbe
-La courbe de tendance de la précédente
-La droite approchant la partie linéaire de la première courbe
Je n'ai pas de problème pour les deux premières, en revanche je bloque pour la dernière.
Voici la partie de mon code concernée:
Set ws = Sheets(Nom)
ws.Activate
With ws
xval = Range("A2:A22") 'abscisse
yval = Range("B2:B22") 'ordonnée
Set chGraph = .ChartObjects.Add(500, 50, 500, 300)
With chGraph.Chart
.ChartType = xlXYScatterLines
.SeriesCollection.NewSeries
.HasTitle = True
.ChartTitle.Text = "Pin vs Pout à " + Nom
With .SeriesCollection(1)
.XValues = xval
.Values = yval
With .Trendlines.Add
.Type = xlPolynomial
.Order = 3
.DisplayEquation = True
.DisplayRSquared = True
End With
.Add Source:=ws.Range("H2:H22") 'Tentative pour afficher la partie linéaire de la première courbe
End With
With .Axes(xlCategory)
.MinimumScale = 15
.MaximumScale = 36
.HasTitle = True
.AxisTitle.Text = "Puissance d'entrée (dBm)"
End With
With .Axes(xlValue)
.MinimumScale = 30
.MaximumScale = 46
.HasTitle = True
.AxisTitle.Text = "Puissance de sortie (dBm)"
End With
End With
End With
Merci pour votre aide,bonsoir,
vous avez quelque valeurs X,Y pour jouer avec ?
Bonjour,
Prenons les suivantes:
A2:A22 : 15, 16, 17 ... 33, 34, 35
B2:B22 : 28.1, 28.8, 29.4, 30.0, 30.5, 31.5, 32.0, 32.4, 32.8, 33.15, 33.4, 33.6, 33.7, 33.8, 33.9, 34.0, 34.1, 34.1, 34.1, 34.1
Et on va dire que le coefficient directeur de la partie linéaire vaut 10.
bonjour,
je ne comprends pas "Et on va dire que le coefficient directeur de la partie linéaire vaut 10."
c'est ceci que vous demandez, mais alors en VBA ?
Bonjour,
Effectivement c'est ce que je souhaite faire. Devant répéter l'opération avec une quarantaine de données d'entrée différentes et potentiellement des évolutions dans l'ordre de la régression il me paraît judicieux d'utiliser une macro.
Pour ce qui est du coefficient directeur, celui-ci est une donnée (tout comme les valeurs que je vous ai indiquées à titre d'exemple) que je ne peux communiquer.
comme essai, ajouter une ligne, peut-être pas 100% ce que vous demandez ??? (Je ne connais pas les bonnes termes en français)
Sub Add_Trendline()
Dim dDirection, dCoeff, dR2, MyX, MyY, Xarr, Yarr
nmb = 10 'les 10 dernieres lignes
With ActiveSheet
Set c = .ListObjects(1).DataBodyRange 'vos données
Set c1 = c.Cells(c.Rows.Count, 1) 'dernier cellule
MsgBox c1.Offset(-nmb + 1, 1).Resize(nmb).Address & " as Y" & vbLf & c1.Offset(-nmb + 1).Resize(nmb).Address & " as X" 'informer
MyX = c1.Offset(-nmb + 1).Resize(nmb).Value 'matrice avec les 10 derniers X-valeurs
MyY = c1.Offset(-nmb + 1, 1).Resize(nmb).Value 'matrice avec les 10 derniers Y-valeurs
a = WorksheetFunction.LinEst(MyY, MyX, 1, 1) 'matrice avec tout les informations
dDirection = a(1, 1)
dCoeff = a(1, 2)
dR2 = a(3, 1)
Xarr = Array(MyX(1, 1), MyX(UBound(MyX), 1)) 'X-valeurs poru la nouvelle série
Yarr = Array(dCoeff + dDirection * MyX(1, 1), dCoeff + dDirection * MyX(UBound(MyX), 1)) 'Y-valeurs pour la nouvelle série
With .ChartObjects("Mon Graphique").Chart 'votre graphique
With .SeriesCollection.NewSeries 'nouvelle série
.Name = "=""Explication Trend"""
.XValues = Xarr
.Values = Yarr
.Format.Line.Weight = 2.75 'épaisseur
.Format.Line.DashStyle = msoLineSysDash 'lignes avec points
.MarkerStyle = -4142 'no markers
End With
End With
End With
End Sub
Merci pour votre essai,
Cela fonctionne effectivement même si cela contourne le problème.
Je n'aime pas en VBA utiliser la méthode LinEst qui fait un bricolage du travail propre de Trendlines.
En effet, si l'on souhaite changer la forme de la fonction (de polynomiale d'ordre 2 à l'ordre 4 ou exponentielle par exemple) il faut avec LinEst réécrire une partie du code, tandis qu'avec Trendlines il suffit de changer un paramètre.
La question reste poser, comment peut-on ajouter une courbe à une autre utilisant Trendlines ?
Honnêtement s'il faut repasser par LinEst, autant faire la manipulation en Python.
on peut lire le contenu de "datalabel" du trendline, si c'est cela que vous voulez dire. Donc je pensais, je met cela dans un boucle, seul problème, il n'y a pas un update du datalabel pendant ce boucle. Donc, pour vous, modifiez le trendline en manuel et lisez après l'update le datalabel with VBA.
Sub TrendLineDetails()
Set trend_line_1 = ActiveSheet.ChartObjects("Mon Graphique").Chart.FullSeriesCollection(1).Trendlines(1)
trend_line_1.DataLabel.NumberFormat = "0,000000000000E+00" 'notation scientifique pour plus de chiffres
For i = 2 To 6
With trend_line_1
.Type = xlPolynomial
.Order = i
End With
With trend_line_1.Parent 'force unsuccessfull update
.XValues = .XValues
End With
Sheets("blad2").Activate 'also unsuccessfull
Sheets("blad1").Activate
s = trend_line_1.DataLabel.Format.TextFrame2.TextRange.Text
sp = Split(Replace(Replace(Replace(Replace(s, " +", "|+"), " -", "|-"), "=", "=|"), Chr(11), "|"), "|")
MsgBox vbLf & Join(sp, vbLf), vbInformation, "trendline coefficients, order " & i
Next
End Sub
un petit peut différent et ceci fonctionne, bizarre ...