Comment annoter une grille?


6

I ont la grille suivante, qui est une table partielle de la fonction linéaire f [x]:

f[x_] := 2 x + 3 
Grid[Join[{{x, y}}, Table[{i, f[i]}, {i, 0, 4}]], 
Dividers -> {{2 -> Directive[Red, Thin]}, {2 -> 
Directive[Red, Thin]}}, Alignment -> {Right, Center}] 

Ce que je voudrais faire est annoter cette grille, pour indiquer la pente et l'ordonnée à l'origine de f [x], comme le montre le graphique ci-dessous:

enter image description here

je peux comprendre comment dessiner l'ellipse en pointillés et des flèches de couleur sur mon propre. Ce que je ne peux pas comprendre, c'est comment ajouter ces annotations graphiques à la grille. Est-ce possible?

(Notez que f [x] seront définis « à la volée », et donc y compris une image statique n'est pas une solution possible.)

+2

mauvaise construction pour ce que vous faites. Utilisez des graphiques pour ce genre de chose. Flèches, cercles, lignes, ellipses, etc ..., ce sont des choses graphiques. La grille est destinée au contrôle de base des données structurées, et non à une carte graphique d'usage général. 26 août. 132013-08-26 23:50:41

  0

@Nasser: Eh bien idéalement, je pourrais superposer les graphiques avec la grille en utilisant Show, Overlay, etc. Mais cela ne fonctionne pas. Je ne serai pas d'accord que c'est la mauvaise construction. 26 août. 132013-08-26 23:54:09

  0

C'est une mauvaise construction. Vous voulez des graphiques, utilisez GraphicsGrid et utilisez Graphics pour dessiner les autres éléments. La grille n'est pas un graphique. 26 août. 132013-08-26 23:55:33

  0

Vous pouvez utiliser 'Show' si vous" rasterisez "votre' Grid'. C'est une manière viable d'aller à moins que vous vouliez exporter des graphiques de vecteur (.eps, .svg). 27 août. 132013-08-27 00:26:11

+1

@Nasser: vous pourriez peut-être poster un exemple de la façon d'obtenir cette table avec les graphiques en utilisant GraphicsGrid. Je ne vois pas comment utiliser un GraphicsGrid allège le besoin de connecter différentes cellules avec des flèches, etc. 27 août. 132013-08-27 00:29:06

  0

Il y a plusieurs fois où un tel mélange de table et de graphiques serait juste ce que je veux. Je suis surpris qu'il n'y ait pas de moyen simple dans Mathematica de l'implémenter facilement. 27 août. 132013-08-27 01:26:40

8

Dans votre cas, le plus grand avantage de GraphicsGrid sur Grid est le Epilog l'option qui vous permet de mettre les éléments supplémentaires sur votre grille de numéros:

f[x_] := 2 x + 3 
GraphicsGrid[ 
Join[{{Style[x, 36], Style[y, 36]}}, 
    Table[{Style[i, 36], Style[f[i], 36]}, {i, 0, 4}]], 
Dividers -> {{2 -> Directive[Red, Thin]}, {2 -> 
    Directive[Red, Thin]}}, Alignment -> {Right, Center}, 
Epilog -> { 
    {Dashed, Circle[{480, -570}, {400, 136}]}, 
    {Blue, Arrow[{{679, -567}, {1028, -1000}}], 
    Arrow[{{679, -1000}, {1028, -1000}}]}, 
    {Black, Text[Style[2, 26], {1058, -1000}]} 
    }, ImagePadding -> {{0, 70}, {0, 0}} 
] 

Mathematica graphics

Il est un peu gênant pour déterminer les coordonnées du GraphicsGrid mais vous pouvez jouer avec les éléments individuels dans un Manipulate pour obtenir les formes où vous les voulez.

  0

Wow, merci! Je vais essayer cela maintenant et voir si je peux trouver un moyen d '"automatiser" trouver les coordonnées pour les flèches. 27 août. 132013-08-27 01:24:46


6

Étant donné qu'un exemple utilisant GraphicsGrid est posté, voici un exemple utilisant des graphiques directs.

Il est bon d'essayer de séparer les données de la présentation. De plus, puisque nous utilisons Mathematica, essayons d'automatiser un peu plus les choses. Ainsi, cette fonction prend la liste des données comme elle et la dessine. Il utilise seulement 2 paramètres, que vous pouvez fixer ou fournir. Il y a les espacements x, y dans la table. Voici un petit Manipuler autour de la fonction à illustrer. Vous pouvez facilement ajuster les choses au besoin. (Ajouter de la couleur, etc ...)

enter image description here

Manipulate[ 

Module[{i}, 
    data = Table[{i, f[i]}, {i, 0, n}]; 
    tbl[data, delX, delY] ], 

{{n, 4, "how big?"}, 2, 20, 1}, 
{{delX, 0.06, "x spacing?"}, 0.02, 0.1, 0.01}, 
{{delY, 0.03, "y spacing?"}, 0.02, 0.1, 0.01}, 

Initialization -> 
    (
    f[x_] := 2 x + 3; 

    tbl[lst_List, delX_, delY_] := 
    Module[{n = Length[lst], sideItem = 2}, 

    getRow[i_, y_] := {Text[ Style[lst[[i, 1]], Large], {0, y}], 
     Text[ Style[lst[[i, 2]], Large], {delX, y}]}; 
    getArrowDown[j_] := Arrow[{{1.08 delX, j}, {1.5 delX, j - delY}}]; 
    getArrowRight[j_] := Arrow[{{1.08 delX, j}, {1.5 delX, j}}]; 
    getSideItem[j_] := Text[Style[sideItem, Large], {1.6 delX, j}]; 

    [email protected][ 
     { 
     Text[Style["x", Italic, Large], {0, 0}], 
     Text[Style["y", Italic, Large], {delX, 0}], 

     Table[getRow[i, -i*delY], {i, n}], 
     Table[getArrowDown[-i*delY], {i, n - 1}], 
     Table[getArrowRight[-i*delY], {i, 2, n}], 
     Table[getSideItem[-i*delY], {i, 2, n}], 

     Line[{{delX/2,delY/2}, {delX/2, -(n + 1)*delY}}],(*vertical line*) 
     Line[{{-delX/2, -delY/2}, {1.5 delX, -delY/2}}] ,(*horizontal line*) 
     {Dashed, Circle[{delX/2, -delY}, {delX, 0.4 delY}]} 
     }, 
     PlotRange -> {{-.03, .2}, {.03, -.4}},Frame->False, Axes->False,ImageSize->300 
     ]   
    ]; 
    ) 
] 
  0

C'est vraiment sympa. Pas seulement le résultat mais la façon dont le code est écrit. Si cela ne vous dérange pas, que fait «Text @ Graphics»? 27 août. 132013-08-27 10:25:50

  0

@Anon, probablement pas nécessaire ici. C'est une habitude.J'enveloppe normalement les graphiques ou les expressions d'évaluation les plus en haut renvoyés, qui sont destinés à l'affichage du cours, avec Text @, qui donne un meilleur aspect au texte des expressions incorporées. Comparez: 'Text [Row [{" test "}]]' vs 'Row [{" test "}]' par exemple. Donc, au lieu d'envelopper tout avec Text @, j'ai mis Text @ autour de tout. Dans cet exemple, je n'en aurais peut-être pas besoin, puisque j'ai déjà du texte à l'intérieur. Mais comme je l'ai dit, je le jette juste par habitude parfois;) 27 août. 132013-08-27 10:31:10

  0

Je vois, c'est bon à savoir. Ty. 27 août. 132013-08-27 14:16:04