34 votes

Comment déterminer PlotRange pour inclure tous les graphiques?

Compte tenu de Graphics objet, comment puis-je déterminer la plage de coordonnées nécessaires pour inclure tous les graphiques? Fondamentalement, j'ai besoin de quelque chose comme ce qu' Show le fait par défaut, mais je tiens à préciser PlotRange,PlotRangePadding et ImagePadding explicitement.

Exemple, les deux Shows ci-dessous doit s'afficher de la même

g = Graphics[{Thickness[1], CapForm["Round"], Line[{{0, 0}, {1, 1}}]}];
Show[g]
Show[g, PlotRange -> getPlotRange[g], PlotRangePadding->getPlotRangePadding[g], ImagePadding->getImagePadding[g]]

Motivation: la fixation des diagrammes dans cette question

Mise à jour: AbsoluteOptions me donne de l' PlotRange mais pas les deux autres options. Spécifiant explicitement ImagePadding->Automatic change d'apparence si c'est soi-disant en Automatic par défaut.

Les deux images ci-dessous montrent différemment et je ne comprends pas pourquoi

g = Graphics[{Thickness[1], CapForm["Round"], Line[{{0, 0}, {1, 1}}]}];
Show[g]
Show[g, Sequence @@ AbsoluteOptions[Show[g]]]

Mise à jour 2: Un problème similaire a été mis il y a un an, avec aucune des solutions proposées, et non pas fixe en tant que de Mathematica 8.0. Pour résumer

  1. Il n'y a aucun moyen de reproduire Show[g] ci-dessus avec la définition explicite de l' PlotRange
  2. Il n'y a aucun moyen d'obtenir absolu ImagePadding utilisée par Show[g]
  3. Show[g,PlotRange->Automatic] semble différent de Show[g]
  4. AbsoluteOptions peut donner le mauvais résultat pour l' PlotRange

5voto

Alexey Popkov Points 5498

Je peux vous suggérons Ticks hack:

pl = Plot[Sin[x], {x, 0, 10}];
Reap[Rasterize[Show[pl, Ticks -> {Sow[{##}] &, Sow[{##}] &}, ImageSize -> 0], 
   ImageResolution -> 1]][[2, 1]]

=> {{-0.208333, 10.2083}, {-1.04167, 1.04167}} 

Le truc, c'est que le réel PlotRange est déterminé par le FrontEnd, pas par le Noyau. Nous nous devons donc de la force de l'Interface pour rendre les graphiques afin d'obtenir tique fonctions évaluées. Ce hack donne la compléter PlotRange avec une valeur explicite de l' PlotRangePadding ajouté.

Plus générale de la solution en tenant compte d'une possibilité qu' pl a une valeur non standard de l' DisplayFinction option et qu'elle peut avoir en Axes valeur False:

completePlotRange[plot:(_Graphics|_Graphics3D|_Graph)] := 
 Quiet@Last@
   Last@Reap[
     Rasterize[
      Show[plot, Axes -> True, Frame -> False, Ticks -> (Sow[{##}] &), 
       DisplayFunction -> Identity, ImageSize -> 0], ImageResolution -> 1]]

On peut obtenir exactement l' PlotRange (sans l' PlotRangePadding ajouté) avec la fonction suivante:

plotRange[plot : (_Graphics | _Graphics3D | _Graph)] := 
 Quiet@Last@
   Last@Reap[
     Rasterize[
      Show[plot, PlotRangePadding -> None, Axes -> True, Frame -> False, 
       Ticks -> (Sow[{##}] &), DisplayFunction -> Identity, ImageSize -> 0], 
      ImageResolution -> 1]]

P. S. Sur la page de Documentation pour PlotRange en vertu de la "Plus d'informations", on peut lire: "AbsoluteOptions donne les paramètres réels pour les options utilisées en interne par Mathematica lorsque le paramètre donné est - Automatic ou All. "(l'emphase est mienne). Il semble donc que la Documentation ne garantit même pas que AbsoluteOptions donnera des valeurs correctes pour PlotRange quand il n'est pas Automatic ou All.

3voto

JxB Points 697

Moi aussi, je trouve parfois confus comment obtenir Mathematica pour afficher Graphics de façon cohérente, en particulier lorsque établir des graphiques.

Pour le graphisme g, il n'a pas d'importance ce que vous fournissez pour l' PlotRangecar Thickness[1] attire toujours une ligne dont l'épaisseur est égale à la trame horizontale de la gamme. Dans votre exemple, Show[g, ___] donne le résultat correct:

automatic image padding.

Show[g], ou simplement en g, est anormale.

Pourquoi?

Je ne sais pas où/si c'est documenté, mais voici quelques-unes des choses qui pourraient être pertinents pour la question.

  1. Évidemment DisplayForm[Graphics[___]] est un raster.

  2. Nous pouvons obtenir un raster de g à l'aide de Pixelliser[g]. Qu'est-ce que le RasterSize? De l'essai et erreur, j'ai trouvé que RasterSize est de 10 * résolution de l'écran (rapporté 72 pixels par pouce sur mon système). Comment puis-je savoir cela? Si je pixelliser g avec une résolution de moins de 718, j'obtiens une image avec les dimensions {360,361}, alors que la valeur par défaut la taille de l'image de g est de 360 pixels sur mon système, j'ai donc figure de Montrer[] un graphique, Mathematica Rasterizes'il à 10x la résolution de l'écran. Quelqu'un sait si cela est vrai? Vous pouvez obtenir la résolution de votre écran (à moins que Mathematica voit) à partir de l'Inspecteur d'Options. Modifier Que l'expression suivante est évaluée True semble montrer que l'affichage graphique est composée à la ImageSize: ImportString[ExportString[Show[g,ImageSize->100],"PNG"]] === ImportString[ExportString[Rasterize[g,RasterSize->100,ImageSize->100],"PNG"]

  3. Pour reproduire Show[g] lors de l'utilisation d' PlotRange - je besoin pour utiliser Show[g,PlotRange->{{0,1},{0,1}},ImagePadding->90.3]

specific image padding

pour l'obtenir à des cultures dans le périmètre de la ligne. Il semble donc que Mathematica est de dire la vérité que l' PlotRange est {{0,1},{0,1}} lors de l'utilisation d' AbsoluteOptions[]. Il n'est pas de déclaration de la valeur réelle de l' ImagePadding. Peut-être parce qu' ImagePadding->Automatic est fondée sur une règle qui utilise le courant ImageSize, PlotRangeClipping,... les paramètres? L' ImagePadding de 90,3 ne fonctionne que pour les ImageSize->360; paramètre ImageSize->200 fait l' ImagePadding de la valeur de mal. Pour le graphique, ImagePadding->90.3*OptionValue[ImageSize]/360 reproduit Show[g,ImageSize->_] sur mon système.

C'est tout ce que j'ai trouvé jusqu'à présent.

3voto

xan Points 3597

Vous pouvez essayer d'ajouter un objet identifiable à un emplacement connu et ensuite voir où elle apparaît dans la exporté version de fournir une échelle de référence. J'ai pensé à un vecteur d'exportation (SVG ou EPS) serait plus facile à analyser, mais je pense que raster est plus facile après avoir joué un peu.

Par exemple, ajouter un rectangle vert couvrant théorique de la parcelle de gamme:

g = Graphics[{Blue, Thickness[1], CapForm["Round"], 
   Line[{{0, 0}, {1, 1}}], Green, Rectangle[{0, 0}, {1, 1}]}];

enter image description here

im = Rasterize[g, ImageSize -> 360];
xy = Transpose[Position[ImageData[im], {0., 1., 0.}]];
pad = Map[{Min[#1], 360 - Max[#1] } &, xy];
Show[g, ImagePadding -> pad]

Le code est essentiellement à déterminer où tous les pixels verts sont. Le rembourrage dans ce cas est {{92, 92}, {92, 92}}, mais il n'a pas besoin d'être symétrique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X