MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Problem/bug with ends of thick lines in graphics

  • To: mathgroup at
  • Subject: [mg88397] Re: Problem/bug with ends of thick lines in graphics
  • From: Szabolcs Horvát <szhorvat at>
  • Date: Mon, 5 May 2008 06:07:24 -0400 (EDT)
  • Organization: University of Bergen
  • References: <fvhe27$3t8$>

David Reiss wrote:
> In a quick search of things I haven't found a mention of the following
> simple graphics issue and I'm checking in with the group to see if
> there is a memory of its mention and if there is a simple fix (and
> which is not a complicated hack) that I've not been able to come up
> with.
> Consider the following graph:
> Plot[x, {x, 1/3, 3/4}, PlotRange -> {{0, 1}, {0, 1}},
>  PlotStyle -> {AbsoluteThickness[20]}]
> When you plot it you will see that the line's ends are not
> rectangular, whereas you would certainly want them to be so. (An
> alternative would be to have them be rounded, for example, but the
> question will remain the same whatever your preference is.)  Rather
> they appear as polygonal in a way inconsistent with the line itself.
> One assums that this is an artifact of how the line is rendered based
> on the individual line segments, and that that segmental rendering has
> to do something with how a segment relates to the segments on either
> side of it.  The lack of a segment beyond the end segment presumably
> runes the algorithm for rendering in a way that leads to this
> appearance.
> I have two related questions here.  The first is how, if at all
> possible, to fix this in a general way through some specific options
> settings for the graphics function.
> The second is how, when exporting this graphic as, say, a PDF, to make
> it behave properly.
> There was a trick in pre version-6 Mathematica that would involve
> adding an explicit postscript command to the PlotStyle option.  Though
> this would not (I think) correct the screen appearance of the graphic,
> it would properly fix it when the graphic was exported to PDF or EPS.
> Here is an example of how it was done:
> Plot[x, {x, 1/3, 3/4}, PlotRange -> {{0, 1}, {0, 1}},
>  PlotStyle -> {{ PostScript["0 setlinecap"],AbsoluteThickness[20]}}]
> This, however, no longer works in Mathematica 6+ presumably because of
> the new way that graphics rendering is handled.
> Does anyone have any solutions to either or both of these issues?

I brought this up two or three times on MathGroup, but never received a 
reply ... So I guess that we have to live without this feature in 
Mathematica 6 ...

I used to use PostScript[" ... "] in Mathematica <= 5.2 to set line caps 
and line joins.  The default was round cap and round join.  But 
PostScript[] does not work any more---not even with EPS or MPS output. 
(One cannot expect it to work with other outputs, of course.)

Unfortunately they changed the defaults to square cap and miter join in 
Mathematica 6. I think that this was the worst possible choice ...  The 
square caps/joins take up more space than either of the two other 
possibilities (bevel/round join), so it is not even possible to emulate 
these by adding bullets at line joins ...

Miter joins cause heavily fluctuating ListPlots to look very ugly and 
"pointy", like a hedgehog.  They could look much better with round joins.

Here's an example:

ListPlot[{{0, 0}, {1, 5}, {2, 0}}, Joined -> True,
  PlotStyle -> Thickness[.1], PlotRange -> {{-1, 3}, {-1, 6.5}}]

Imagine this repeated a thousand times with sharper angles.

Unfortunately the pointy line joins are not the only things that can 
cause troubles ... The shape of a Point[] can also be quite strange at 
small sizes:  Mathematica switches to square or other point shapes at 
small sizes, which is useful for raster graphics, but does not make any 
sense for PostScript/PDF output.  And the PostScript output generated 
for Point[]s is just awful: instead of defining one simple point drawing 
command, and using it consistently, these whole series of commands for 
drawing these strange shapes is repeated for each point.  Just try the 
following to see what I mean:

ExportString[Point[RandomReal[1, {10, 2}]] // Graphics, "EPS"]

Yet another graphics export problem is this:

ap = ArrayPlot[RandomInteger[1, {200, 200}],
    ColorFunction -> (If[# > 0.5, Black, White] &)];

gr = GraphicsRow[{ap, ap}]

Export["gr.pdf", gr]

Open the PDF and see how the small black and white squares that make up 
the graphic are completely misaligned, making the output completely 
useless.  The PDF output looks completely different than the rendering 
in the front end.

I really hope that these problems will be fixed for 6.1 ...

  • Prev by Date: Re: Re: Bilateral cell problem w/ Manipulate
  • Next by Date: Re: orthonormal eigenvectors
  • Previous by thread: Problem/bug with ends of thick lines in graphics
  • Next by thread: Re: Problem/bug with ends of thick lines in graphics