1325 lines
130 KiB
HTML
1325 lines
130 KiB
HTML
|
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Appendix C. FAQ</title><link rel="stylesheet" type="text/css" href="manual.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.0"><link rel="home" href="index.html" title="JpGraph Manual"><link rel="up" href="pt09.html" title="Part IX. Appendices"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Appendix C. FAQ</th></tr><tr><td width="20%" align="left"> </td><th width="60%" align="center">Part IX. Appendices</th><td width="20%" align="right"> </td></tr></table><hr></div><div class="appendix" title="Appendix C. FAQ"><div class="titlepage"><div><div><h2 class="title"><a name="app.faq"></a>Appendix C. FAQ</h2></div></div></div>
|
|||
|
<div class="qandaset" title="Frequently Asked Questions"><a name="id2623081"></a><dl><dt>C.1. <a href="apc.html#id2623083">Where should I install the library?</a></dt><dt>C.2. <a href="apc.html#id2623132">Can I use JpGraph with Windows/Unix/Linux etc? </a></dt><dt>C.3. <a href="apc.html#id2623153"> My Web-admin does not allow PHP any write permissions and hence I can't use
|
|||
|
the cache feature of JpGraph. Is there any way to completely turn off the
|
|||
|
caching feature?</a></dt><dt>C.4. <a href="apc.html#id2623188"> After installation all I get is an empty page when I try any of the
|
|||
|
examples?</a></dt><dt>C.5. <a href="apc.html#id2623207"> How can I send the generated graph to both the browser and a file at the same
|
|||
|
time?</a></dt><dt>C.6. <a href="apc.html#id2623322"> What is this 'auto' I see in all the Graph() creating in the Examples
|
|||
|
directory? Do I need it?</a></dt><dt>C.7. <a href="apc.html#id2623344"> The Client side image map examples does not work on my machine?</a></dt><dt>C.8. <a href="apc.html#id2623366"> When I run 'testsuit_jpgraph.php' I get a warning "Due to insufficient
|
|||
|
permission the source files can't be automatically created"</a></dt><dt>C.9. <a href="apc.html#id2623393"> How can I pass data to my image generating script?</a></dt><dt>C.10. <a href="apc.html#id2623433"> How can I use data from an Excel spreadsheet?</a></dt><dt>C.11. <a href="apc.html#id2623494"> How do I pass data from a Database (e.g. MySQL) to a script to produce a
|
|||
|
graph?</a></dt><dt>C.12. <a href="apc.html#id2623533"> I change my data but my image does not get updated? The old image is still
|
|||
|
send back to the browser?</a></dt><dt>C.13. <a href="apc.html#id2623628"> Can I run JpGraph in batch-mode just outputting an image directly to a file
|
|||
|
and not streamed back to the browser? </a></dt><dt>C.14. <a href="apc.html#id2623649"> Is there a mailing list for JpGraph? </a></dt><dt>C.15. <a href="apc.html#id2623669"> Do you offer a commercial version of JpGraph with full support and no
|
|||
|
QPL?</a></dt><dt>C.16. <a href="apc.html#id2623712"> Some of my script just return a blank image and no error messages? </a></dt><dt>C.17. <a href="apc.html#id2623726"> I can see the generated image fine in the browser but I can't print it?
|
|||
|
</a></dt><dt>C.18. <a href="apc.html#id2623764"> How can I generate an image directly to disk without streaming it back to the
|
|||
|
browser?</a></dt><dt>C.19. <a href="apc.html#id2623786"> When I try to plot graphs with many 1000:s of data points I only get a blank
|
|||
|
page. Is there a limit in JpGraph to the number of data points you can plot?
|
|||
|
</a></dt><dt>C.20. <a href="apc.html#id2623785"> How can I use an image in a dynamically created PDF?</a></dt><dt>C.21. <a href="apc.html#id2623880"> How can I force the user to get a question to download the generated image
|
|||
|
instead of just displaying it in the browser? </a></dt><dt>C.22. <a href="apc.html#id2623909"> How can I open up a CSIM link in a graph in a separate window?</a></dt><dt>C.23. <a href="apc.html#id2623967"> No TTF fonts are displayed.</a></dt><dt>C.24. <a href="apc.html#id2624032"> All my TTF fonts are yellow no matter what color I specify?</a></dt><dt>C.25. <a href="apc.html#id2624050"> I get an error "This PHP build has not been configured with TTF support. You
|
|||
|
need to recompile your PHP installation with FreeType support."</a></dt><dt>C.26. <a href="apc.html#id2624075"> I get an error "Fatal error: Font cant be
|
|||
|
found"</a></dt><dt>C.27. <a href="apc.html#id2624110"> I get the error "Can't find font file
|
|||
|
FONT_PATHarial.ttf" (or some other font)</a></dt><dt>C.28. <a href="apc.html#id2624140"> I get an error "Font file ... is not readable or does not
|
|||
|
exist"</a></dt><dt>C.29. <a href="apc.html#id2624180"> How can I install additional TTF font families? </a></dt><dt>C.30. <a href="apc.html#id2624094"> How can I display special characters that isn't available on the
|
|||
|
keyboard?</a></dt><dt>C.31. <a href="apc.html#id2624261"> When I put a text object on a graph and use Set90AndMargin() it doesn't
|
|||
|
show?</a></dt><dt>C.32. <a href="apc.html#id2624327"> I get an error "Error: Cannot add header information
|
|||
|
- headers already sent ..."
|
|||
|
</a></dt><dt>C.33. <a href="apc.html#id2624383"> I get an error "Unknown function
|
|||
|
imagecreate"</a></dt><dt>C.34. <a href="apc.html#id2624416"> I get an error "Unknown function
|
|||
|
imagecreatejpeg"</a></dt><dt>C.35. <a href="apc.html#id2624444"> I get an error "Warning: MkDir failed (Permission
|
|||
|
denied) in jpgraph.php on line XXXX"</a></dt><dt>C.36. <a href="apc.html#id2624472"> I get an error "Fatal error: Undefined class name
|
|||
|
"parent" in jpgraph.php on line xxxx"</a></dt><dt>C.37. <a href="apc.html#id2624508"> I get an error "Your data contains non-numeric
|
|||
|
values."</a></dt><dt>C.38. <a href="apc.html#id2624542"> I get an error "Date is outside specified scale
|
|||
|
range" trying to create a Gantt chart</a></dt><dt>C.39. <a href="apc.html#id2624570"> I get an error "Invalid file handle in jpgraph.php at
|
|||
|
line XXXX"</a></dt><dt>C.40. <a href="apc.html#id2624518"> I get an error "Fatal error: Call to undefined
|
|||
|
function: getcsimareas() ..."
|
|||
|
</a></dt><dt>C.41. <a href="apc.html#id2624550"> I get an error "Fatal error: Call to undefined
|
|||
|
function: imagetypes()"</a></dt><dt>C.42. <a href="apc.html#id2624654"> I get an error saying something like "Error:
|
|||
|
'parent::' not valid in context..."</a></dt><dt>C.43. <a href="apc.html#id2624682"> I get an error "Image cannot be displayed because it
|
|||
|
contains errors.."</a></dt><dt>C.44. <a href="apc.html#id2624727"> When I use PHP5 + JpGraph 2.x I get "A plot has an
|
|||
|
illegal scale..."</a></dt><dt>C.45. <a href="apc.html#id2624776"> I try to mix bar and line graphs and the bars doesn't get centered and the
|
|||
|
labels are not correctly aligned?</a></dt><dt>C.46. <a href="apc.html#id2624663"> How do I turn off anti-aliasing for TTF fonts?</a></dt><dt>C.47. <a href="apc.html#id2624842"> The auto-scaling algorithm chooses very tight limits around my Y-values. How
|
|||
|
do I get more "space" between the end of the scale and the min/max values?
|
|||
|
</a></dt><dt>C.48. <a href="apc.html#id2624861"> I want to use autoscaling to handle the maximum value but I always want the
|
|||
|
Y-axis to start at 0 regardless of the actual minimum value?</a></dt><dt>C.49. <a href="apc.html#id2624902"> I want the position of the X-axis to be at the bottom of the Y-scale and not
|
|||
|
always at the position Y=0?</a></dt><dt>C.50. <a href="apc.html#id2624946"> I specify color X in the image but the color displayed is not exactly what I
|
|||
|
specified?</a></dt><dt>C.51. <a href="apc.html#id2624988"> Can I have labels at an arbitrary angle on the X-axis? </a></dt><dt>C.52. <a href="apc.html#id2625029"> How do I invert the Y-scale so that it has the minimum value on top and the
|
|||
|
largest value at the bottom?</a></dt><dt>C.53. <a href="apc.html#id2625086"> Can I have the auto-scaling algorithm restrict itself to whole
|
|||
|
numbers?</a></dt><dt>C.54. <a href="apc.html#id2625104"> Is it possible to have horizontal bar graphs?</a></dt><dt>C.55. <a href="apc.html#id2625124"> Line weight does not seem to work in my graphs? I specify a thick line but
|
|||
|
still get a thin line?</a></dt><dt>C.56. <a href="apc.html#id2625155"> How can I have more space between the Y-axis and the title? </a></dt><dt>C.57. <a href="apc.html#id2625168"> How can I display both X and Y values above each data point in a line, bar or
|
|||
|
scatter plot?</a></dt><dt>C.58. <a href="apc.html#id2625213"> Can I display stock box-charts (open, close, high, low) with JpGraph? </a></dt><dt>C.59. <a href="apc.html#id2625231"> Is there any way to specify a newline in the legend box for a specific
|
|||
|
legend?</a></dt><dt>C.60. <a href="apc.html#id2625258"> How can I print unicode characters?</a></dt><dt>C.61. <a href="apc.html#id2625220"> My background images doesn't display properly. It just shows a black solid
|
|||
|
square? </a></dt><dt>C.62. <a href="apc.html#id2625314"> How do I make each bar in a bar plot have it's own color?</a></dt><dt>C.63. <a href="apc.html#id2625331"> How can I adjust the position of the axis title?</a></dt><dt>C.64. <a href="apc.html#id2625364"> How can I change the image format, i.e jpeg, gif or png? </a></dt><dt>C.65. <a href="apc.html#id2625346"> How do I specify the font for legends?</a></dt><dt>C.66. <a href="apc.html#id2625424"> When I rotate text and labels the text is not rotated correctly?</a></dt><dt>C.67. <a href="apc.html#id2625406"> When I rotate a paragraph (multi-line) text the paragraph is always left
|
|||
|
aligned even though I have specified another alignment. It seems fine for
|
|||
|
non-rotated paragraphs though. What is the problem? </a></dt><dt>C.68. <a href="apc.html#id2625472"> I have a huge number of data points and I only want labels (which I want to
|
|||
|
specify as text string) and ticks on every n:th data. Can I do this?</a></dt><dt>C.69. <a href="apc.html#id2625497"> How can I make the labels have a 1000 comma separator?</a></dt><dt>C.70. <a href="apc.html#id2625536"> The Y2 axis is no longer positioned at the right side of the graph</a></dt><dt>C.71. <a href="apc.html#id2625573"> How can I include several graphs in the same image?</a></dt><dt>C.72. <a href="apc.html#id2625627"> How can I have an exploded slice with 3D pie plots?</a></dt><dt>C.73. <a href="apc.html#id2625654"> How can I display values for each slice close to the pie?</a></dt><dt>C.74. <a href="apc.html#id2625667"> How can I change between percentage and absolute values for pie slices?
|
|||
|
</a></dt><dt>C.75. <a href="apc.html#id2625719"> Can I display the actual value as labels on the pie bar instead of the
|
|||
|
percentage?</a></dt><dt>C.76. <a href="apc.html#id2625742"> How can I adust the start angle of the first slice?</a></dt><dt>C.77. <a href="apc.html#id2625757"> When I use IE v5 or v6 I can only save the generated graph image in the
|
|||
|
browser as a BMP file even if it was generated as a JPEG or PNG encoded
|
|||
|
image?</a></dt></dl><table border="0" width="100%" summary="Q and A Set"><col align="left" width="1%"><col><tbody>
|
|||
|
<tr class="question" title="C.1."><td align="left" valign="top"><a name="id2623083"></a><a name="id2623097"></a><p><b>C.1.</b></p></td><td align="left" valign="top"><p>Where should I install the library?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> The simple answer is: Anywhere You like! Since the necessary library files
|
|||
|
are included in Your own script with an "include" (or more likely a
|
|||
|
require_once) statement it doesn't matter where You put the library as long as
|
|||
|
Your scripts can access it. A common place is to store the library is in a
|
|||
|
directory where PHP searches for include files (as specified in Your
|
|||
|
<code class="filename">php.ini</code> file), for example in
|
|||
|
"<code class="filename">/usr/share/php</code>" or perhaps
|
|||
|
"<code class="filename">/usr/local/php</code>" depending on Your PHP configuration. </p><p> An even simpler way is to just store the library in a directory where Your
|
|||
|
scripts are executed from. However , this is not really recommended. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.2."><td align="left" valign="top"><a name="id2623132"></a><a name="id2623134"></a><p><b>C.2.</b></p></td><td align="left" valign="top"><p>Can I use JpGraph with Windows/Unix/Linux etc? </p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Yes. The library itself is OS-agnostic. As long as you have a WEB server
|
|||
|
which supports PHP 4.3.x (or above) and have the GD library. Please note though
|
|||
|
that the behavior of PHP/Apache on Unix and Windows seems to have some subtle
|
|||
|
differences which might affect things like path specification using '/' or '\'. </p><p>
|
|||
|
</p><div class="caution" title="Caution" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Caution</h3>
|
|||
|
<p>The library does not support any 64bit OS and there are known issues
|
|||
|
with running the library on a 64bit OS (either Unix or Windows). There
|
|||
|
are currently no plans to address this in the near future.</p>
|
|||
|
</div><p>
|
|||
|
</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.3."><td align="left" valign="top"><a name="id2623153"></a><a name="id2623168"></a><p><b>C.3.</b></p></td><td align="left" valign="top"><p> My Web-admin does not allow PHP any write permissions and hence I can't use
|
|||
|
the cache feature of JpGraph. Is there any way to completely turn off the
|
|||
|
caching feature?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Yes, set the constant "<code class="code">USE_CACHE</code>" to <code class="code">FALSE</code> in
|
|||
|
jpg-config.php. This way will skip writing file even if a filename has been
|
|||
|
submitted in the Graph() creation call. You can also accomplish this by not
|
|||
|
having any file name at all in the call to Graph().</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.4."><td align="left" valign="top"><a name="id2623188"></a><a name="id2623198"></a><p><b>C.4.</b></p></td><td align="left" valign="top"><p> After installation all I get is an empty page when I try any of the
|
|||
|
examples?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> If the HTTP server response is truly absolutely empty (verify that by looking
|
|||
|
at the source of the page that gets returned to the browser) then the only
|
|||
|
answer is that the HTTP server has crashed. Most likely it is the PHP process
|
|||
|
within the server that has crashed. Even though PHP is fairly stable there are
|
|||
|
still ways of crashing it. To investigate this further You might try to: </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
|||
|
<p>... investigate the system log for traces of a server
|
|||
|
crash.</p>
|
|||
|
</li><li class="listitem">
|
|||
|
<p>... try increase the maximum allowed memory for PHP in php.ini. As
|
|||
|
a rule it should be a minimum of 32MB (and preferable 64MB)</p>
|
|||
|
</li><li class="listitem">
|
|||
|
<p>... upgrade PHP to the latest stable version (and use the compile
|
|||
|
options shown further down in this FAQ.</p>
|
|||
|
</li><li class="listitem">
|
|||
|
<p>... upgrade PHP to the latest stable version (and use the compile
|
|||
|
options shown further down in this FAQ.</p>
|
|||
|
</li><li class="listitem">
|
|||
|
<p>... enable all errors and warning for PHP (in php.ini) to help
|
|||
|
track down the problem.</p>
|
|||
|
</li><li class="listitem">
|
|||
|
<p>... disable output buffering to get errors send back to the
|
|||
|
browser as soon as possible (in <code class="filename">php.ini</code>)</p>
|
|||
|
</li></ul></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.5."><td align="left" valign="top"><a name="id2623207"></a><a name="id2623284"></a><p><b>C.5.</b></p></td><td align="left" valign="top"><p> How can I send the generated graph to both the browser and a file at the same
|
|||
|
time?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This is not directly supported by means of any particular option or setting
|
|||
|
in the library but with small "trick" this is easy enough to accomplish. </p><p> The idea is to use the _IMG_HANDLER option that forces the
|
|||
|
<code class="code">Graph::Stroke()</code> to just return the image handler and then stop.
|
|||
|
We can then manually first send the image to the chosen file and then stream it
|
|||
|
back to the browser using some internal methods in the library. </p><p> The following code snippet shows how this is done </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
15
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-inlinetags"><?php</span><span class="hl-code">
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">Graph</span><span class="hl-brackets">(</span><span class="hl-number">400</span><span class="hl-code">,</span><span class="hl-number">300</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
<... </span><span class="hl-identifier">code</span><span class="hl-code"> </span><span class="hl-identifier">to</span><span class="hl-code"> </span><span class="hl-identifier">generate</span><span class="hl-code"> </span><span class="hl-identifier">a</span><span class="hl-code"> </span><span class="hl-identifier">graph</span><span class="hl-code"> ...>
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Get the handler to prevent the library from sending the </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> image to the browser</span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-var">$gdImgHandler</span><span class="hl-code"> = </span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">Stroke</span><span class="hl-brackets">(</span><span class="hl-identifier">_IMG_HANDLER</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Stroke image to a file and browser </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Default is PNG so use ".png" as suffix </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-var">$fileName</span><span class="hl-code"> = </span><span class="hl-quotes">"</span><span class="hl-string">/tmp/imagefile.png</span><span class="hl-quotes">"</span><span class="hl-code">; </span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">img</span><span class="hl-code">-></span><span class="hl-identifier">Stream</span><span class="hl-brackets">(</span><span class="hl-var">$fileName</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Send it back to browser </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">img</span><span class="hl-code">-></span><span class="hl-identifier">Headers</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">img</span><span class="hl-code">-></span><span class="hl-identifier">Stream</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-inlinetags">?></span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.6."><td align="left" valign="top"><a name="id2623322"></a><a name="id2623324"></a><p><b>C.6.</b></p></td><td align="left" valign="top"><p> What is this 'auto' I see in all the Graph() creating in the Examples
|
|||
|
directory? Do I need it?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> No. The third argument in the graph call is an optional cache file name and
|
|||
|
is not necessary unless You want to use the caching feature of JpGraph. By
|
|||
|
specifying 'auto' the filename is automatically created based on the name of the
|
|||
|
script file.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.7."><td align="left" valign="top"><a name="id2623344"></a><a name="id2623346"></a><p><b>C.7.</b></p></td><td align="left" valign="top"><p> The Client side image map examples does not work on my machine?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> In order to run the examples the code generates HTML to read the image from
|
|||
|
the cache directory as Apache sees it. You must adjust the image tag to have the
|
|||
|
correct path to your cache directory. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.8."><td align="left" valign="top"><a name="id2623366"></a><a name="id2623368"></a><p><b>C.8.</b></p></td><td align="left" valign="top"><p> When I run 'testsuit_jpgraph.php' I get a warning "Due to insufficient
|
|||
|
permission the source files can't be automatically created"</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This is not a serious problem. When the testsuit is run it tries to create a
|
|||
|
symbolic link with the same base name as the individual testfile but with
|
|||
|
extension ".phps". This is just so it is possible to click on an image and then
|
|||
|
view the source syntax colored. If Apache doesn't have write permissions to the
|
|||
|
directory where 'testsuit_jpgraph.php' is executed from you will get this
|
|||
|
warning.</p><p> If you want to use this feature just change the permissions so Apache may
|
|||
|
write to the directory.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.9."><td align="left" valign="top"><a name="id2623393"></a><a name="id2623395"></a><p><b>C.9.</b></p></td><td align="left" valign="top"><p> How can I pass data to my image generating script?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> There are basically three(four) ways:</p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
|||
|
<p>Read the data from a file</p>
|
|||
|
</li><li class="listitem">
|
|||
|
<p>Read the data from a DB</p>
|
|||
|
</li><li class="listitem">
|
|||
|
<p>Pass the data in the <<span class="markup">img</span>> tag using URL
|
|||
|
parameter passing. For example <code class="code"> <img
|
|||
|
src="myimg.php?d1=2&d2=7&d3=12" border=0>
|
|||
|
</code> This method is not suitable for large data sets since there is
|
|||
|
an upper bound to the length of an URL specification (around 255
|
|||
|
characters)</p>
|
|||
|
</li><li class="listitem">
|
|||
|
<p>A fourth way might be to use session variables to pass the data
|
|||
|
between different scripts. For large data sets the only practical way is
|
|||
|
to read the data from a file or from a DB to construct the data
|
|||
|
vectors.</p>
|
|||
|
</li></ul></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.10."><td align="left" valign="top"><a name="id2623433"></a><a name="id2623464"></a><p><b>C.10.</b></p></td><td align="left" valign="top"><p> How can I use data from an Excel spreadsheet?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Export the data from Excel as a CSV (Comma separated Values) file to be able
|
|||
|
to easily read the file. Then either write your own routine to read and parse
|
|||
|
the data from that file or use the utility class "ReadCSV" in
|
|||
|
"jpgraph_utils.php". </p><p> A basic example on how to do this for a line graph assuming the name of the
|
|||
|
data file is "data.csv".</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
15
|
|||
|
16
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-inlinetags"><?php</span><span class="hl-code"> </span><span class="hl-reserved">include</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">../jpgraph.php</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-reserved">include</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">../jpgraph_line.php</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-reserved">include</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">../jpgraph_utils.inc</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$n</span><span class="hl-code"> = </span><span class="hl-identifier">ReadFileData</span><span class="hl-code">::</span><span class="hl-identifier">FromCSV</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">data.csv</span><span class="hl-quotes">'</span><span class="hl-code">,</span><span class="hl-var">$datay</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-reserved">if</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-var">$n</span><span class="hl-code"> == </span><span class="hl-reserved">false</span><span class="hl-code"> </span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
|
|||
|
</span><span class="hl-reserved">die</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">Can't read data.csv.</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-brackets">}</span><span class="hl-code">
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Setup the graph $graph = new Graph(400,300);</span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">title</span><span class="hl-code">-></span><span class="hl-identifier">Set</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">Reading CSV file with </span><span class="hl-quotes">'</span><span class="hl-code">.</span><span class="hl-var">$n</span><span class="hl-code">.</span><span class="hl-quotes">'</span><span class="hl-string"> data points</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">SetScale</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">intlin</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-var">$l1</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">LinePlot</span><span class="hl-brackets">(</span><span class="hl-var">$datay</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">Add</span><span class="hl-brackets">(</span><span class="hl-var">$l1</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">Stroke</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-inlinetags">?></span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.11."><td align="left" valign="top"><a name="id2623494"></a><a name="id2623496"></a><p><b>C.11.</b></p></td><td align="left" valign="top"><p> How do I pass data from a Database (e.g. MySQL) to a script to produce a
|
|||
|
graph?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> By adding some SQL statements in Your graph scripts that creates the data
|
|||
|
arrays from the DB. </p><p> Watch out for empty values and strings. JpGraph doesn't know how to plot
|
|||
|
strings. Any value passed into JpGraph should be only valid numeric data. See
|
|||
|
the online discussions on populating from a DB Populating DB or the discussion
|
|||
|
on how to read data from file Reading from file. </p><p> See <code class="uri"><a class="uri" href="http://jpgraph.intellit.nl/viewtopic.php?t=8" target="_top">How to
|
|||
|
populate arrays from mySQL</a></code>
|
|||
|
</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.12."><td align="left" valign="top"><a name="id2623533"></a><a name="id2623524"></a><p><b>C.12.</b></p></td><td align="left" valign="top"><p> I change my data but my image does not get updated? The old image is still
|
|||
|
send back to the browser?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> What you are seeing is a cached version of Your image. Depending on your
|
|||
|
setup it could either be that the browser has a cached image or You are using
|
|||
|
the built-in cache system in the library by accident. </p><p>
|
|||
|
<span class="bold"><strong>Fixing the browser cache</strong></span> Since the script from
|
|||
|
the browser point of view is the same it just displays the old image. To fix
|
|||
|
this you need to turn of the browser image caching. </p><p> Another "trick" that can be used since normally it is impossible to control
|
|||
|
the browser for the end user is ot add a "dummy" URL argument which changes.
|
|||
|
This way the browser will always see a new URL and then always reload that file.
|
|||
|
This could be done for example as:</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">echo ('<img src="graphscript.php?' .microtime().'">');</span></pre></td></tr></table></div><p>
|
|||
|
<span class="bold"><strong>Fixing the library cache</strong></span></p><p> The other reason might be that You have enabled the built-in cache feature in
|
|||
|
JpGraph. To turn it of You can either </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
|||
|
<p> Not specify a cache name in the call to Graph(). Just call new
|
|||
|
Graph(200,200) for example.</p>
|
|||
|
</li><li class="listitem">
|
|||
|
<p> Turn off the reading from the cache by setting READ_CACHE to
|
|||
|
false (in jpg-config.inc)</p>
|
|||
|
</li><li class="listitem">
|
|||
|
<p> Turn off the reading and writing from the cache by setting
|
|||
|
USE_CACHE to false (in jpg-config.php)</p>
|
|||
|
</li><li class="listitem">
|
|||
|
<p> Use the cache but with a timeout so that the image will be
|
|||
|
re-generated if the cached image is older then the specified timeout
|
|||
|
value in the call to Graph().</p>
|
|||
|
</li></ul></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.13."><td align="left" valign="top"><a name="id2623628"></a><a name="id2623630"></a><p><b>C.13.</b></p></td><td align="left" valign="top"><p> Can I run JpGraph in batch-mode just outputting an image directly to a file
|
|||
|
and not streamed back to the browser? </p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Yes. Just specify an absolute file name in the call to Graph::Stroke(). To
|
|||
|
store the image in the local temp directory use: </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$myGraph->Stroke("/tmp/myimage.png");</span></pre></td></tr></table></div><div class="caution" title="Caution" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Caution</h3>
|
|||
|
<p>Note: You must match the file ending Yourself to the format you have
|
|||
|
chosen to generate the image in.</p>
|
|||
|
</div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.14."><td align="left" valign="top"><a name="id2623649"></a><a name="id2623660"></a><p><b>C.14.</b></p></td><td align="left" valign="top"><p> Is there a mailing list for JpGraph? </p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> No, but there is a user <code class="uri"><a class="uri" href="http://jpgraph.intellit.nl/index.php" target="_top">community forum</a></code> at
|
|||
|
<code class="uri"><a class="uri" href="http://jpgraph.intellit.nl/index.php" target="_top">http://jpgraph.intellit.nl/index.php</a></code> where users discuss various
|
|||
|
aspects of the library.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.15."><td align="left" valign="top"><a name="id2623669"></a><a name="id2623694"></a><p><b>C.15.</b></p></td><td align="left" valign="top"><p> Do you offer a commercial version of JpGraph with full support and no
|
|||
|
QPL?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Yes, For commercial (non-open-source) you will need to get the "JpGraph
|
|||
|
Professional License". This allows you you deploy JpGraph in a commercial
|
|||
|
context. Further details upon contact.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.16."><td align="left" valign="top"><a name="id2623712"></a><a name="id2623714"></a><p><b>C.16.</b></p></td><td align="left" valign="top"><p> Some of my script just return a blank image and no error messages? </p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This could potentially be a lot of things depending on which browser you are
|
|||
|
using. One thing you might want to check is that your script doesn't take to
|
|||
|
long time. In that case they might hit the time limit for running a PHP script
|
|||
|
as specified in php.ini. You can adjust that time limit with a call to
|
|||
|
set_time_limit().</p><p> If You are seeing just an empty page (really empty) then this is a sign that
|
|||
|
Your server has crashed. Most likely an old version of PHP is being used which
|
|||
|
has taken down the HTTP server process. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.17."><td align="left" valign="top"><a name="id2623726"></a><a name="id2623742"></a><p><b>C.17.</b></p></td><td align="left" valign="top"><p> I can see the generated image fine in the browser but I can't print it?
|
|||
|
</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This is again browser dependent. Some browser does not like to print an image
|
|||
|
which is generated on-line and does exist as a *.jpg, *.png etc file. No good
|
|||
|
workaround has been identified short of changing browser. Some browsers (and
|
|||
|
versions) can print others not. The only real safe way (if you need printing) is
|
|||
|
to generate the image on disk and then have the browser read the image from
|
|||
|
there. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.18."><td align="left" valign="top"><a name="id2623764"></a><a name="id2623766"></a><p><b>C.18.</b></p></td><td align="left" valign="top"><p> How can I generate an image directly to disk without streaming it back to the
|
|||
|
browser?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Two ways: (Preferred way) If you supply a filename in the call to
|
|||
|
$graph->Stroke() the image will be written to that file and not be streamed back
|
|||
|
to the browser. If you prefer to have the image going to the cache directory but
|
|||
|
not streamed back then you could just set the '$aInlineFlag' in the initial call
|
|||
|
to Graph() (fifth argument) to false as in
|
|||
|
</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$mygraph = new Graph(200,200,"auto",0,false);</span></pre></td></tr></table></div><p>
|
|||
|
The "auto" argument makes an automatic file name in the cache based on the
|
|||
|
script name. The 0 indicates that we have no timeout. The advantage with this
|
|||
|
method is that you can specify a timeout to avoid having the image generated to
|
|||
|
often. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.19."><td align="left" valign="top"><a name="id2623786"></a><a name="id2623797"></a><p><b>C.19.</b></p></td><td align="left" valign="top"><p> When I try to plot graphs with many 1000:s of data points I only get a blank
|
|||
|
page. Is there a limit in JpGraph to the number of data points you can plot?
|
|||
|
</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> No, there is no such limit. The problem is most likely that your script takes
|
|||
|
so long time that the PHP execution limit (as specified in php.ini) aborts the
|
|||
|
script. If you have more than 10,000 data points JpGraph will work but doing
|
|||
|
this kind of heavy data analysis on a WEB-server extension is probably not a
|
|||
|
good idea to start with.</p><p> The other reason could be that the script exhausts the allowed memory limit
|
|||
|
for PHP as specified in the "php.ini" file. By default this is often set to 8Mb
|
|||
|
which is to low for a complex JpGraph script. Try increasing the memory limit to
|
|||
|
a minimum of 16Mb. For very complex graphs with 1000s of data points there might
|
|||
|
be a need to increase the memory even further. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.20."><td align="left" valign="top"><a name="id2623785"></a><a name="id2623827"></a><p><b>C.20.</b></p></td><td align="left" valign="top"><p> How can I use an image in a dynamically created PDF?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You can do this in two ways, you can either stroke the image created with the
|
|||
|
library directly to a file where it can be used with Your PDF library of choice.
|
|||
|
For example, using FPDF (<code class="uri"><a class="uri" href="http://www.fpdf.org/" target="_top">www.fpdf.org</a></code>) the Image() function would have to be used to read an
|
|||
|
image from the filesystem. </p><p> If You are using the PDF library (APIs included in the PHP distribution but
|
|||
|
the library itself might require a license depending on Your usage.) you can
|
|||
|
avoid the storage of the file by getting the image handler for the image
|
|||
|
directly and use it with PDF. </p><p> With the PDF library you must first open the in memory image with a call to
|
|||
|
<code class="code">pdf_open_memory_image($pdf, $im)</code>. The following script places
|
|||
|
an image from JpGraph directly into a PDF page that is returned when running
|
|||
|
this script. </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
15
|
|||
|
16
|
|||
|
17
|
|||
|
18
|
|||
|
19
|
|||
|
20
|
|||
|
21
|
|||
|
22
|
|||
|
23
|
|||
|
24
|
|||
|
25
|
|||
|
26
|
|||
|
27
|
|||
|
28
|
|||
|
29
|
|||
|
30
|
|||
|
31
|
|||
|
32
|
|||
|
33
|
|||
|
34
|
|||
|
35
|
|||
|
36
|
|||
|
37
|
|||
|
38
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-inlinetags"><?php</span><span class="hl-code">
|
|||
|
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">Graph</span><span class="hl-brackets">(</span><span class="hl-code">...</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Code to create the graph </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> .........................</span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Put the image in a PDF page </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-var">$im</span><span class="hl-code"> = </span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">Stroke</span><span class="hl-brackets">(</span><span class="hl-identifier">_IMG_HANDLER</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$pdf</span><span class="hl-code"> = </span><span class="hl-identifier">pdf_new</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">pdf_open_file</span><span class="hl-brackets">(</span><span class="hl-var">$pdf</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Convert the GD image to somehing the </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> PDFlibrary knows how to handle </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-var">$pimg</span><span class="hl-code"> = </span><span class="hl-identifier">pdf_open_memory_image</span><span class="hl-brackets">(</span><span class="hl-var">$pdf</span><span class="hl-code">, </span><span class="hl-var">$im</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-identifier">pdf_begin_page</span><span class="hl-brackets">(</span><span class="hl-var">$pdf</span><span class="hl-code">, </span><span class="hl-number">595</span><span class="hl-code">, </span><span class="hl-number">842</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">pdf_add_outline</span><span class="hl-brackets">(</span><span class="hl-var">$pdf</span><span class="hl-code">, </span><span class="hl-quotes">'</span><span class="hl-string">Page 1</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">pdf_place_image</span><span class="hl-brackets">(</span><span class="hl-var">$pdf</span><span class="hl-code">, </span><span class="hl-var">$pimg</span><span class="hl-code">, </span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-number">500</span><span class="hl-code">, </span><span class="hl-number">1</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">pdf_close_image</span><span class="hl-brackets">(</span><span class="hl-var">$pdf</span><span class="hl-code">, </span><span class="hl-var">$pimg</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">pdf_end_page</span><span class="hl-brackets">(</span><span class="hl-var">$pdf</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">pdf_close</span><span class="hl-brackets">(</span><span class="hl-var">$pdf</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-var">$buf</span><span class="hl-code"> = </span><span class="hl-identifier">pdf_get_buffer</span><span class="hl-brackets">(</span><span class="hl-var">$pdf</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$len</span><span class="hl-code"> =</span><span class="hl-identifier">strlen</span><span class="hl-brackets">(</span><span class="hl-var">$buf</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Send PDF mime headers </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-identifier">header</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">Content-type: application/pdf</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">header</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">Content-Length: </span><span class="hl-var">$len</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">header</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">Content-Disposition: inline; filename=foo.pdf</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Send the content of the PDF file </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
|
|||
|
</span><span class="hl-reserved">echo</span><span class="hl-code"> </span><span class="hl-var">$buf</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> .. and clean up </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-identifier">pdf_delete</span><span class="hl-brackets">(</span><span class="hl-var">$pdf</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-inlinetags">?></span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.21."><td align="left" valign="top"><a name="id2623880"></a><a name="id2623882"></a><p><b>C.21.</b></p></td><td align="left" valign="top"><p> How can I force the user to get a question to download the generated image
|
|||
|
instead of just displaying it in the browser? </p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Change your code for creating the image: </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-inlinetags"><?php</span><span class="hl-code">
|
|||
|
</span><span class="hl-var">$im</span><span class="hl-code">=</span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">Stroke</span><span class="hl-brackets">(</span><span class="hl-identifier">_IMG_HANDLER</span><span class="hl-brackets">)</span><span class="hl-code">; </span><span class="hl-var">$filename</span><span class="hl-code">=</span><span class="hl-quotes">"</span><span class="hl-string">chart</span><span class="hl-quotes">"</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$file_type</span><span class="hl-code"> = </span><span class="hl-quotes">"</span><span class="hl-string">image/png</span><span class="hl-quotes">"</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$file_ending</span><span class="hl-code"> = </span><span class="hl-quotes">"</span><span class="hl-string">png</span><span class="hl-quotes">"</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$filename</span><span class="hl-code">=</span><span class="hl-var">$filename</span><span class="hl-code">.</span><span class="hl-quotes">"</span><span class="hl-string">.</span><span class="hl-quotes">"</span><span class="hl-code">.</span><span class="hl-var">$file_ending</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-identifier">header</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">Content-Type: application/</span><span class="hl-var">$file_type</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">header</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">Content-Disposition:attachment; filename=</span><span class="hl-quotes">"</span><span class="hl-code">.</span><span class="hl-var">$filename</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">header</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">Pragma: no-cache</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">header</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">Expires:0</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">ImagePNG</span><span class="hl-brackets">(</span><span class="hl-var">$im</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-inlinetags">?></span></pre></td></tr></table></div><p> A html link, which directs to the php page (assuming the filename is
|
|||
|
chart.php): Download Then, if you click on the link, a download dialog appears
|
|||
|
and you can download the "chart.png". </p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3>
|
|||
|
<p>If you directly open chart.php, the image is directly streamed to the
|
|||
|
browser and the download dialog will not open. </p>
|
|||
|
</div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.22."><td align="left" valign="top"><a name="id2623909"></a><a name="id2623921"></a><p><b>C.22.</b></p></td><td align="left" valign="top"><p> How can I open up a CSIM link in a graph in a separate window?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> To open a target CSIM (drill down) in a separate window some javascript in
|
|||
|
the target link is necessary since this action must be performed in the browser.
|
|||
|
The target URL needs top be in the form of an action to open up a window (with
|
|||
|
any optional URL argument that might be needed). For example, assume we have a
|
|||
|
bar graph and that theb user can click on each bar to get more details. When the
|
|||
|
user clicks on a bar we open up the detaails witha call to the helper script
|
|||
|
"bar_details.php" and send the parameter "id" to the script to separate the
|
|||
|
individual bars. We would then use the following URL link (with javascript) </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">"javascript:window.open('bar_details.php?id=%d','_new','width=500,height=300');void(0)"</span></pre></td></tr></table></div><p> Where the '%d' placeholder must be replaced by the appropriate Id for each
|
|||
|
bar. To assign the appropriate id we could use the following construct </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
15
|
|||
|
16
|
|||
|
17
|
|||
|
18
|
|||
|
19
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-inlinetags"><?php</span><span class="hl-code">
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Create targets for the image maps so that the details are opened </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> in a separate window </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-var">$fmtStr</span><span class="hl-code"> = </span><span class="hl-quotes">"</span><span class="hl-string">javascript:window.open('bar_details.php?id=%d','_new','width=500,height=300');
|
|||
|
void(0)</span><span class="hl-quotes">"</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$n</span><span class="hl-code"> = </span><span class="hl-identifier">count</span><span class="hl-brackets">(</span><span class="hl-var">$datay</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$targ</span><span class="hl-code">=</span><span class="hl-reserved">array</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$alts</span><span class="hl-code">=</span><span class="hl-reserved">array</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-reserved">for</span><span class="hl-brackets">(</span><span class="hl-var">$i</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">; </span><span class="hl-var">$i</span><span class="hl-code"> < </span><span class="hl-var">$n</span><span class="hl-code">; ++</span><span class="hl-var">$i</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
|
|||
|
</span><span class="hl-var">$targ</span><span class="hl-brackets">[</span><span class="hl-var">$i</span><span class="hl-brackets">]</span><span class="hl-code"> = </span><span class="hl-identifier">sprintf</span><span class="hl-brackets">(</span><span class="hl-var">$fmtStr</span><span class="hl-code">,</span><span class="hl-var">$i</span><span class="hl-code">+</span><span class="hl-number">1</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$alts</span><span class="hl-brackets">[</span><span class="hl-var">$i</span><span class="hl-brackets">]</span><span class="hl-code"> = </span><span class="hl-quotes">'</span><span class="hl-string">val=%d</span><span class="hl-quotes">'</span><span class="hl-code">;
|
|||
|
</span><span class="hl-brackets">}</span><span class="hl-code">
|
|||
|
|
|||
|
</span><span class="hl-var">$bplot</span><span class="hl-code">-></span><span class="hl-identifier">SetCSIMTargets</span><span class="hl-brackets">(</span><span class="hl-var">$targ</span><span class="hl-code">,</span><span class="hl-var">$alts</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">Add</span><span class="hl-brackets">(</span><span class="hl-var">$bplot</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
...
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Send back the HTML page to browser </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">StrokeCSIM</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-inlinetags">?></span></pre></td></tr></table></div><p> It should be noted that in the above Javascript code we have used the special
|
|||
|
window name '_new' which means that a new window will be opened each time a user
|
|||
|
clicks on a bar. By giving the window a specific name the same window would be
|
|||
|
re-used every time. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.23."><td align="left" valign="top"><a name="id2623967"></a><a name="id2623969"></a><p><b>C.23.</b></p></td><td align="left" valign="top"><p> No TTF fonts are displayed.</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> There are potentially many reasons for this Please start by trying the
|
|||
|
following bare bones PHP script to see if basic TTF support is available in the
|
|||
|
PHP setup. </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
15
|
|||
|
16
|
|||
|
17
|
|||
|
18
|
|||
|
19
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-inlinetags"><?php</span><span class="hl-code">
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Change this defines to where Your fonts are stored </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-reserved">DEFINE</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">TTF_DIR</span><span class="hl-quotes">"</span><span class="hl-code">,</span><span class="hl-quotes">"</span><span class="hl-string">/usr/X11R6/lib/X11/fonts/truetype/</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Change this define to a font file that You know that You have</span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-reserved">DEFINE</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">TTF_FONTFILE</span><span class="hl-quotes">"</span><span class="hl-code">,</span><span class="hl-quotes">"</span><span class="hl-string">arial.ttf</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Text to display </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-reserved">DEFINE</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">TTF_TEXT</span><span class="hl-quotes">"</span><span class="hl-code">,</span><span class="hl-quotes">"</span><span class="hl-string">Hello World!</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-var">$im</span><span class="hl-code"> = </span><span class="hl-identifier">imagecreatetruecolor</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-number">400</span><span class="hl-code">, </span><span class="hl-number">100</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$white</span><span class="hl-code"> = </span><span class="hl-identifier">imagecolorallocate</span><span class="hl-brackets">(</span><span class="hl-var">$im</span><span class="hl-code">, </span><span class="hl-number">255</span><span class="hl-code">, </span><span class="hl-number">255</span><span class="hl-code">, </span><span class="hl-number">255</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$black</span><span class="hl-code"> = </span><span class="hl-identifier">imagecolorallocate</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-var">$im</span><span class="hl-code">, </span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-number">0</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-identifier">imagefilledrectangle</span><span class="hl-brackets">(</span><span class="hl-var">$im</span><span class="hl-code">,</span><span class="hl-number">0</span><span class="hl-code">,</span><span class="hl-number">0</span><span class="hl-code">,</span><span class="hl-number">399</span><span class="hl-code">,</span><span class="hl-number">99</span><span class="hl-code">,</span><span class="hl-var">$white</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">imagettftext</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-var">$im</span><span class="hl-code">, </span><span class="hl-number">30</span><span class="hl-code">, </span><span class="hl-number">0</span><span class="hl-code">, </span><span class="hl-number">10</span><span class="hl-code">, </span><span class="hl-number">40</span><span class="hl-code">,</span><span class="hl-var">$black</span><span class="hl-code">, </span><span class="hl-identifier">TTF_DIR</span><span class="hl-code">.</span><span class="hl-identifier">TTF_FONTFILE</span><span class="hl-code">,</span><span class="hl-identifier">TTF_TEXT</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">header</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">Content-type: image/png</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-identifier">imagepng</span><span class="hl-code"> </span><span class="hl-brackets">(</span><span class="hl-var">$im</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-inlinetags">?></span></pre></td></tr></table></div><p> The above script when run should produce an image with a black text string on
|
|||
|
a white background. If this doesn't work then there is a setup problem with PHP
|
|||
|
+ TTF. </p><p> As a first step to resolve this recompile Your PHP4 setup using the following
|
|||
|
basic configuration (depending on the local conditions some options/path might
|
|||
|
have to be changed). The critical options are marked in bold. </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
15
|
|||
|
16
|
|||
|
17
|
|||
|
18
|
|||
|
19
|
|||
|
20
|
|||
|
21
|
|||
|
22
|
|||
|
23
|
|||
|
24
|
|||
|
25
|
|||
|
26
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">./configure
|
|||
|
--prefix=/usr/share \
|
|||
|
--datadir=/usr/share/php \
|
|||
|
--with-apxs=/usr/sbin/apxs \
|
|||
|
--libdir=/usr/share --includedir=/usr/include \
|
|||
|
--bindir=/usr/bin \
|
|||
|
--with-config-file-path=/etc \
|
|||
|
--enable-mbstring --enable-mbregex \
|
|||
|
--with-mysql \
|
|||
|
<span class="bold"><strong>--with-gd \
|
|||
|
--enable-gd-imgstrttf \
|
|||
|
--enable-gd-native-ttf \
|
|||
|
--with-ttf-dir=/usr/lib \
|
|||
|
--with-freetype-dir=/usr/lib \
|
|||
|
--with-zlib-dir=/usr/lib \
|
|||
|
--with-png-dir=/usr/lib \
|
|||
|
--with-jpeg-dir=/usr/lib \
|
|||
|
</strong></span>--with-xpm-dir=/usr/X11R6 \
|
|||
|
--with-tiff-dir=/usr/lib \
|
|||
|
--enable-memory-limit --enable-safe-mode \
|
|||
|
--bindir=/usr/bin \
|
|||
|
--enable-bcmath -enable-calendar \
|
|||
|
--enable-ctype --with-ftp \
|
|||
|
--enable-magic-quotes \
|
|||
|
--enable-inline-optimization \
|
|||
|
--with-iconv</span></pre></td></tr></table></div><p> If there is still no TTF fonts displayed then the next step is to upgrade
|
|||
|
Your TTF libraries to the latest version. The FreeType version 2.1.9 is known to
|
|||
|
work well. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.24."><td align="left" valign="top"><a name="id2624032"></a><a name="id2624034"></a><p><b>C.24.</b></p></td><td align="left" valign="top"><p> All my TTF fonts are yellow no matter what color I specify?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You have a old buggy version of the FreeType library, most likely the old
|
|||
|
FreeType I library is being used. Please upgrade to the latest version of
|
|||
|
FreeType II.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.25."><td align="left" valign="top"><a name="id2624050"></a><a name="id2624052"></a><p><b>C.25.</b></p></td><td align="left" valign="top"><p> I get an error "This PHP build has not been configured with TTF support. You
|
|||
|
need to recompile your PHP installation with FreeType support."</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This error is reported if the built-in PHP/GD function <code class="uri"><a class="uri" href="http://www.php.net/manual/en/function.imagettfbbox.php" target="_top">"imagettfbbox()"</a></code> is not available. This is a crucial method to make
|
|||
|
TTF fonts work with JpGraph. The most likely reason for this problem is that the
|
|||
|
PHP configuration is faulty and does not have correct support for TTF fonts.
|
|||
|
Please recompile PHP as shown above and make sure that the built-in version of
|
|||
|
GD is being used and not the stand-alone library. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.26."><td align="left" valign="top"><a name="id2624075"></a><a name="id2624085"></a><p><b>C.26.</b></p></td><td align="left" valign="top"><p> I get an error <span class="errmsg">"Fatal error: Font cant be
|
|||
|
found"</span></p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You have either not specified a correct path where your fonts are stored (see
|
|||
|
top of jpg-config.inc) or you have tried to use a font you do not have
|
|||
|
installed.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.27."><td align="left" valign="top"><a name="id2624110"></a><a name="id2624112"></a><p><b>C.27.</b></p></td><td align="left" valign="top"><p> I get the error <span class="errmsg">"Can't find font file
|
|||
|
FONT_PATHarial.ttf"</span> (or some other font)</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You are most likely running on Windows. This seems to be caused by a bug in
|
|||
|
PHP/Apache (or PHP/IIS) specifically on Windows. The problem seems to be that
|
|||
|
PHP doesn't remember a DEFINE() setting across two or more include directive. A
|
|||
|
simple workaround is to hard-code the font path in class TTF in file
|
|||
|
jpgraph.php. Note: If you have this problem you will most likely also have a
|
|||
|
problem with the path to the cache directory.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.28."><td align="left" valign="top"><a name="id2624140"></a><a name="id2624016"></a><p><b>C.28.</b></p></td><td align="left" valign="top"><p> I get an error <span class="emphasis"><em>"Font file ... is not readable or does not
|
|||
|
exist"</em></span></p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This error is caused by the inability of PHP/JpGraph to read the font file.
|
|||
|
This could have several reasons: </p><div class="itemizedlist"><ul class="itemizedlist" type="disc"><li class="listitem">
|
|||
|
<p>The file path or name is wrong and the file really doesn't exist.
|
|||
|
Please check that the file and path (as shown in the error message)
|
|||
|
really exists.</p>
|
|||
|
</li><li class="listitem">
|
|||
|
<p>If the file exists it might still not be possible for PHP to read the
|
|||
|
file due to permission problem. Please make sure that PHP can read a
|
|||
|
file in the TTF directory. This can be verified with the following short
|
|||
|
script </p>
|
|||
|
<div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-inlinetags"><?php</span><span class="hl-code">
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Change this defines to where Your fonts are stored </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-reserved">DEFINE</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">TTF_DIR</span><span class="hl-quotes">"</span><span class="hl-code">,</span><span class="hl-quotes">"</span><span class="hl-string">/usr/X11R6/lib/X11/fonts/truetype/</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Change this define to a font file that You know that You have</span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
</span><span class="hl-reserved">DEFINE</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">TTF_FONTFILE</span><span class="hl-quotes">"</span><span class="hl-code">,</span><span class="hl-quotes">"</span><span class="hl-string">arial.ttf</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-var">$f</span><span class="hl-code"> = </span><span class="hl-identifier">TTF_DIR</span><span class="hl-code">.</span><span class="hl-identifier">TTF_FONTFILE</span><span class="hl-code">;
|
|||
|
</span><span class="hl-reserved">if</span><span class="hl-brackets">(</span><span class="hl-code"> </span><span class="hl-identifier">file_exists</span><span class="hl-brackets">(</span><span class="hl-var">$f</span><span class="hl-brackets">)</span><span class="hl-code"> === </span><span class="hl-reserved">false</span><span class="hl-code"> || </span><span class="hl-identifier">is_readable</span><span class="hl-brackets">(</span><span class="hl-var">$f</span><span class="hl-brackets">)</span><span class="hl-code"> === </span><span class="hl-reserved">false</span><span class="hl-code"> </span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
|
|||
|
</span><span class="hl-reserved">echo</span><span class="hl-code"> </span><span class="hl-quotes">"</span><span class="hl-string">FAIL: Can not read font file </span><span class="hl-special">\"</span><span class="hl-var">$f</span><span class="hl-special">\"</span><span class="hl-string">.</span><span class="hl-quotes">"</span><span class="hl-code">;
|
|||
|
</span><span class="hl-brackets">}</span><span class="hl-code"> </span><span class="hl-reserved">else</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
|
|||
|
</span><span class="hl-reserved">echo</span><span class="hl-code"> </span><span class="hl-quotes">"</span><span class="hl-string">PASS: Successfully read font file </span><span class="hl-special">\"</span><span class="hl-var">$f</span><span class="hl-special">\"</span><span class="hl-string">.</span><span class="hl-quotes">"</span><span class="hl-code">;
|
|||
|
</span><span class="hl-brackets">}</span><span class="hl-code">
|
|||
|
</span><span class="hl-inlinetags">?></span></pre></td></tr></table></div>
|
|||
|
<p> If the script reports <span class="emphasis"><em>FAIL</em></span> then it must be
|
|||
|
investigated whether the file names or permissions are wrong. </p>
|
|||
|
</li></ul></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.29."><td align="left" valign="top"><a name="id2624180"></a><a name="id2624074"></a><p><b>C.29.</b></p></td><td align="left" valign="top"><p> How can I install additional TTF font families? </p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> See the <code class="uri"><a class="uri" href="phptip04.php" target="_top">Adding additional TTF font
|
|||
|
families</a></code> section on this site for a full explanation of the necessary
|
|||
|
steps.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.30."><td align="left" valign="top"><a name="id2624094"></a><a name="id2624231"></a><p><b>C.30.</b></p></td><td align="left" valign="top"><p> How can I display special characters that isn't available on the
|
|||
|
keyboard?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> By using the standard "&#dddd" encoding of the symbol in a text string.
|
|||
|
For example, to get the character for the "copyright" symbol &copy; which
|
|||
|
has the numeric code "00A9" (in Hex) </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$copy = sprintf('&#%04d;',hexdec('00A9'));</span></pre></td></tr></table></div><p>In a similar way this can be used to show Greek letters, for example
|
|||
|
"&#0946;" (beta) is displayed by</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$beta = sprintf('&#%04d;',hexdec('03B2'));</span></pre></td></tr></table></div><div class="tip" title="Tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3>
|
|||
|
<p>Use the class "<code class="code">SymChar</code>" defined in jpgraph_utils.php to get
|
|||
|
easy access to greek and special mathematical symbols. This class allow the
|
|||
|
specification of common symbols by name. Some examples:</p>
|
|||
|
<div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
15
|
|||
|
16
|
|||
|
17
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">// &#0948; (delta)
|
|||
|
$gamma = SymChar::Get('delta');
|
|||
|
|
|||
|
// &#0956; (mu)
|
|||
|
$mu = SymChar::Get('mu');
|
|||
|
|
|||
|
// &#0960; (pi)
|
|||
|
$pi = SymChar::Get('pi');
|
|||
|
|
|||
|
// &#0955; (lambda)
|
|||
|
$lambda = SymChar::Get('lambda');
|
|||
|
|
|||
|
// &#8747; (integral sign)
|
|||
|
$integral = SymChar::Get('int');
|
|||
|
|
|||
|
// &#8776; (approximation sign)
|
|||
|
$approx = SymChar::Get('approx');</span></pre></td></tr></table></div>
|
|||
|
</div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.31."><td align="left" valign="top"><a name="id2624261"></a><a name="id2624281"></a><p><b>C.31.</b></p></td><td align="left" valign="top"><p> When I put a text object on a graph and use Set90AndMargin() it doesn't
|
|||
|
show?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> The main cause for this behaviour is that the text object position is rotated
|
|||
|
90 degrees. For example, putting a text object at Pos(0,0) it will become
|
|||
|
"invisible". The reason for this behaviour is that the texts position (not the
|
|||
|
text itself) is rotated around the center of the image 90 degrees clockwise. </p><p> For example, assuming the image is WxH in size. Rotating position (0,0) which
|
|||
|
is the top left corner of the image gives the rotated position: </p><p>
|
|||
|
<code class="code">(0,0) => rotate 90 degrees => (W,0)</code>
|
|||
|
</p><p> Now, if a string was put at position (W,0) it will be drawn outside the image
|
|||
|
and hence become invisible. </p><p> If You need to position text with rotated images just keep this in mind and
|
|||
|
swap the meaning of the X and Y position since the X-position will become the Y
|
|||
|
position and vice versa after a 90 degree rotation. Some experiments will soon
|
|||
|
allow You to get the hang of it. </p><div class="tip" title="Tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3>
|
|||
|
<p>Start with an image that is equal in W and H since this makes it easier to
|
|||
|
understand the rotation.</p>
|
|||
|
</div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.32."><td align="left" valign="top"><a name="id2624327"></a><a name="id2624336"></a><p><b>C.32.</b></p></td><td align="left" valign="top"><p> I get an error <span class="errmsg">"Error: Cannot add header information
|
|||
|
- headers already sent ..."</span>
|
|||
|
</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> First, this is not a problem with JpGraph per se. What has happened is that
|
|||
|
your PHP file which produces the image has already returned some data to the
|
|||
|
browser before the image has been sent. This is most often caused by one or more
|
|||
|
spaces before the first "<?php" The browser will now implicitly set the
|
|||
|
header to plain text. </p><p> When later JpGraph tries to send the correct image header the browser gets
|
|||
|
confused since it has already received a header for the current document. (Each
|
|||
|
document can only have one and only one type). Check your files for any output
|
|||
|
(even a single space) before the call to Graph::Graph() (or Graph::Stroke()) </p><p> If you are running on Windows this problem could be caused by a blank line at
|
|||
|
the end of any of the jpgraph_*.php files. All files in jpgraph ends in a
|
|||
|
newline which some configurations on Windows doesn't like. Remove the newline so
|
|||
|
that the file ends just after the final "?>" </p><p> Also remember that when you include external file using include/include_once
|
|||
|
and so on Php include the whole content of the file; this content of the file
|
|||
|
also include any potential carriage return/line feed or "blank" space before
|
|||
|
"<?php" and after "?>" These "dirty characters" will stop the JpGraph
|
|||
|
being properly sent back because they are included in the image streaming.
|
|||
|
</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.33."><td align="left" valign="top"><a name="id2624383"></a><a name="id2624385"></a><p><b>C.33.</b></p></td><td align="left" valign="top"><p> I get an error <span class="errmsg">"Unknown function
|
|||
|
<code class="code">imagecreate</code>"</span></p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You have not compiled PHP with support for the GD graphic library. See PHP
|
|||
|
documentation for details. Note that you also need to configure PHP to use GD
|
|||
|
and/or TTF fonts to get JpGraph full functionality</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.34."><td align="left" valign="top"><a name="id2624416"></a><a name="id2624418"></a><p><b>C.34.</b></p></td><td align="left" valign="top"><p> I get an error <span class="errmsg">"Unknown function
|
|||
|
<code class="code">imagecreatejpeg</code>"</span></p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You have not compiled PHP with support for the JPG format. See PHP
|
|||
|
documentation for details</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.35."><td align="left" valign="top"><a name="id2624444"></a><a name="id2624446"></a><p><b>C.35.</b></p></td><td align="left" valign="top"><p> I get an error <span class="errmsg">"Warning: MkDir failed (Permission
|
|||
|
denied) in jpgraph.php on line XXXX"</span></p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This is a permission problem. To use the cache Apache/PHP must have write
|
|||
|
permission to the cache directory. Make sure that Apache/PHP have sufficient
|
|||
|
permissions to write to the specified cache directory.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.36."><td align="left" valign="top"><a name="id2624472"></a><a name="id2624474"></a><p><b>C.36.</b></p></td><td align="left" valign="top"><p> I get an error <span class="errmsg">"Fatal error: Undefined class name
|
|||
|
"parent" in jpgraph.php on line xxxx"</span></p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You are using an older version of PHP. JpGraph 1.x requires at least PHP
|
|||
|
4.3</p><p>
|
|||
|
</p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3>
|
|||
|
<p>Remember that JpGraph 1.x has reached its end of life and is no longer
|
|||
|
maintained.</p>
|
|||
|
</div><p>
|
|||
|
</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.37."><td align="left" valign="top"><a name="id2624508"></a><a name="id2624510"></a><p><b>C.37.</b></p></td><td align="left" valign="top"><p> I get an error <span class="errmsg">"Your data contains non-numeric
|
|||
|
values."</span></p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Most likely Your data really contains non-numeric data which You need to
|
|||
|
further investigate (for example by printing out the array with a
|
|||
|
<code class="code">var_dump()</code>. One additional thing to watch out for is if the
|
|||
|
data looks like ".56" (or "-.56") which is a shortform of "0.56". The problem is
|
|||
|
that the number starts with an "." (dot) which is non-numeric. The solution is
|
|||
|
to replace the single dot with a "0."</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.38."><td align="left" valign="top"><a name="id2624542"></a><a name="id2624544"></a><p><b>C.38.</b></p></td><td align="left" valign="top"><p> I get an error <span class="errmsg">"Date is outside specified scale
|
|||
|
range"</span> trying to create a Gantt chart</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> As the error says, you start or end date for a activity is larger/smaller
|
|||
|
than the max/min value in the scale. If you get this error and you are using
|
|||
|
automatic scale then you are probably using a null value (empty string "") as
|
|||
|
start or end date. Check your data</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.39."><td align="left" valign="top"><a name="id2624570"></a><a name="id2624572"></a><p><b>C.39.</b></p></td><td align="left" valign="top"><p> I get an error <span class="errmsg">"Invalid file handle in jpgraph.php at
|
|||
|
line XXXX"</span></p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This is a permission problem. Check that your cache directory has the right
|
|||
|
permissions to let JpGraph access and write to it. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.40."><td align="left" valign="top"><a name="id2624518"></a><a name="id2624596"></a><p><b>C.40.</b></p></td><td align="left" valign="top"><p> I get an error <span class="errmsg">"Fatal error: Call to undefined
|
|||
|
function: getcsimareas() ..."</span>
|
|||
|
</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You have enabled the <code class="code">DEFINE("JPG_DEBUG",true)</code> in jpgraph.php.
|
|||
|
This is an internal debug flag which should always be left untouched. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.41."><td align="left" valign="top"><a name="id2624550"></a><a name="id2624625"></a><p><b>C.41.</b></p></td><td align="left" valign="top"><p> I get an error <span class="errmsg">"Fatal error: Call to undefined
|
|||
|
function: imagetypes()"</span></p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You have not installed the core GD library correct. <code class="code">imagetypes()</code>
|
|||
|
is a standard GD function. Please refer to the installation section in the
|
|||
|
manual for more information on how to verify You setup.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.42."><td align="left" valign="top"><a name="id2624654"></a><a name="id2624656"></a><p><b>C.42.</b></p></td><td align="left" valign="top"><p> I get an error saying something like <span class="errmsg">"Error:
|
|||
|
'parent::' not valid in context..."</span></p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You are most likely using the Zend cache. There is a bug with some versions
|
|||
|
of the Zend cache together with the "parent" meta class. If the referenced
|
|||
|
parent class is in another file that is included this problem seems to occur.
|
|||
|
The workaround seems to be to put all classes in the same physical file or
|
|||
|
upgrade the Zend cache to a more recent version.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.43."><td align="left" valign="top"><a name="id2624682"></a><a name="id2624684"></a><p><b>C.43.</b></p></td><td align="left" valign="top"><p> I get an error <span class="errmsg">"Image cannot be displayed because it
|
|||
|
contains errors.."</span></p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> First of all this is an error message from the browser and not the library.
|
|||
|
There could be various reasons for this but the most likely scenario is that
|
|||
|
Your installation of PHP has both enabled output buffering and enabled strict
|
|||
|
error checking. </p><p> What could now happen is that with output buffering enabled PHP will buffer
|
|||
|
up any text error messages. This could for example be som "Notice:" warnings if
|
|||
|
You have forgotten to initialize some variables. When then the library adds the
|
|||
|
proper image header and the buffered error messages together with the image gets
|
|||
|
sent back the browser it all falls apart. </p><p> The browser tries to interpret both the error messages and the image data as
|
|||
|
an image and it of course fails and gives this error message. Why? Because the
|
|||
|
textual error messages that was buffered is interpreted as if they would belong
|
|||
|
to the image which of course is nonsense. </p><p> The solution is to disable output-buffering until You are convinced that Your
|
|||
|
code is without any problem. On a development server it is recommended to always
|
|||
|
have output buffering disabled. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.44."><td align="left" valign="top"><a name="id2624727"></a><a name="id2624729"></a><p><b>C.44.</b></p></td><td align="left" valign="top"><p> When I use PHP5 + JpGraph 2.x I get <span class="errmsg">"A plot has an
|
|||
|
illegal scale..."</span></p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> There have been a few reports of this problem and it seems to be due to a
|
|||
|
faulty PHP 5.x installation. For example a standard SuSE 9.3 PHP5 installation
|
|||
|
gives this problem. The exact reason for the problem has not been established
|
|||
|
but it all points to a PHP5 problem since it can be solved by adjusting the PHP
|
|||
|
installation without any change in the library. </p><p><span class="bold"><strong> Step 1: </strong></span></p><p> First check that Your php.ini file have compatibility mode turned off (in
|
|||
|
<code class="filename">php.ini</code>)</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">zend.ze1_compatibility_mode=off</span></pre></td></tr></table></div><p>
|
|||
|
<span class="bold"><strong>Step 2: </strong></span></p><p> If turning the compatibility mode off still doesn't solve the problem the
|
|||
|
only remaining solution is to re-compile PHP 5. For example on our development
|
|||
|
servers we use the following configuration Note: We place "php.ini" in
|
|||
|
"/etc/php5/apache2" and You might want to change this to suit Your specific
|
|||
|
setup. </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
15
|
|||
|
16
|
|||
|
17
|
|||
|
18
|
|||
|
19
|
|||
|
20
|
|||
|
21
|
|||
|
22
|
|||
|
23
|
|||
|
24
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">./configure
|
|||
|
--prefix=/usr/share --datadir=/usr/share/php \
|
|||
|
--with-apxs2=/usr/sbin/apxs2-prefork \
|
|||
|
--libdir=/usr/share
|
|||
|
--includedir=/usr/include \
|
|||
|
--bindir=/usr/bin \
|
|||
|
--with-config-file-path=/etc/php5/apache2 \
|
|||
|
--enable-mbstring --enable-mbregex \
|
|||
|
--with-mysql \
|
|||
|
--with-gd --enable-gd-imgstrttf --enable-gd-native-ttf \
|
|||
|
--with-zlib-dir=/usr/lib \
|
|||
|
--with-png-dir=/usr/lib --with-jpeg-dir=/usr/lib --with-xpm-dir=/usr/X11R6 \
|
|||
|
--with-tiff-dir=/usr/lib --with-ttf-dir=/usr/lib \
|
|||
|
--with-freetype-dir=/usr/lib \
|
|||
|
--enable-ftp \
|
|||
|
--enable-memory-limit
|
|||
|
--enable-safe-mode \
|
|||
|
--bindir=/usr/bin \
|
|||
|
--enable-bcmath -enable-calendar \
|
|||
|
--enable-ctype --with-ftp \
|
|||
|
--enable-magic-quotes \
|
|||
|
--enable-inline-optimization \
|
|||
|
--with-bz2 \
|
|||
|
--with-iconv</span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.45."><td align="left" valign="top"><a name="id2624776"></a><a name="id2624802"></a><p><b>C.45.</b></p></td><td align="left" valign="top"><p> I try to mix bar and line graphs and the bars doesn't get centered and the
|
|||
|
labels are not correctly aligned?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This is a known problem. The best way to partly solve this is to make sure
|
|||
|
you add the bar plot as the last plot to the graph. The reason behind this
|
|||
|
problem is that plot that gets added to the graph internally makes modification
|
|||
|
to the alignment of the plot. Since each plot does not know what other plot has
|
|||
|
been added it will happily overwrite previous plots settings in the graph. Hence
|
|||
|
the workaround by adding the bar last. conflicting settings.)</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.46."><td align="left" valign="top"><a name="id2624663"></a><a name="id2624823"></a><p><b>C.46.</b></p></td><td align="left" valign="top"><p> How do I turn off anti-aliasing for TTF fonts?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> There is not any built in support in JpGraph to do this. Since the whole
|
|||
|
purpose of TTF fonts is to provide a smooth font experience there is really no
|
|||
|
point in wanting to do this. If you want non-aliased fonts you should use the
|
|||
|
built-in bitmap fonts.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.47."><td align="left" valign="top"><a name="id2624842"></a><a name="id2624844"></a><p><b>C.47.</b></p></td><td align="left" valign="top"><p> The auto-scaling algorithm chooses very tight limits around my Y-values. How
|
|||
|
do I get more "space" between the end of the scale and the min/max values?
|
|||
|
</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Use the <code class="code">SetGrace()</code> to specify some extra space (as percentage of
|
|||
|
the scale) between the min/max value and the limits of the scale. For example
|
|||
|
<code class="code">$graph->yscale->SetGrace(10)</code> gives 10% extra space at the
|
|||
|
ends.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.48."><td align="left" valign="top"><a name="id2624861"></a><a name="id2624874"></a><p><b>C.48.</b></p></td><td align="left" valign="top"><p> I want to use autoscaling to handle the maximum value but I always want the
|
|||
|
Y-axis to start at 0 regardless of the actual minimum value?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Use the <code class="code">SetAutoMin()</code> method. For example as in </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">...
|
|||
|
$graph = new Graph(400,350);
|
|||
|
$graph->SetScale("intlin");
|
|||
|
$graph->yaxis->scale->SetAutoMin(0);
|
|||
|
...</span></pre></td></tr></table></div><div class="tip" title="Tip" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Tip</h3>
|
|||
|
<p>If you need to limit the maximum value but auto-scale the minimum value
|
|||
|
use the <code class="code">SetAutoMax() </code>method.</p>
|
|||
|
</div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.49."><td align="left" valign="top"><a name="id2624902"></a><a name="id2624916"></a><p><b>C.49.</b></p></td><td align="left" valign="top"><p> I want the position of the X-axis to be at the bottom of the Y-scale and not
|
|||
|
always at the position Y=0?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> To adjust the position of the Axis Use the <code class="code">Axis::SetPos()</code>
|
|||
|
method. The argument to this method can be either the numerical scale value on
|
|||
|
the Y-axis where the X-axis should be positioned or it can be one of the two
|
|||
|
special value "min" or "max". In the latter case the axis will be positioned on
|
|||
|
either the minimum or the maximum value of the scale. For example
|
|||
|
</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">...
|
|||
|
$graph->xaxis->SetPos("min");
|
|||
|
...</span></pre></td></tr></table></div><p>
|
|||
|
Will put the X-axis at the lowest value of the Y-axis. </p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3>
|
|||
|
<p>The same positioning is possible for the Y-axis.</p>
|
|||
|
</div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.50."><td align="left" valign="top"><a name="id2624946"></a><a name="id2624954"></a><p><b>C.50.</b></p></td><td align="left" valign="top"><p> I specify color X in the image but the color displayed is not exactly what I
|
|||
|
specified?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This is a result of a finite color palette for GIF, PNG formats. If you are
|
|||
|
using anti-aliasing, perhaps a background image or even gradient fill you might
|
|||
|
exhaust the color palette supported in the GD library. Try set the constant
|
|||
|
<code class="code">USE_APPROX_COLORS</code> to false and generate the picture again. If
|
|||
|
you now get an error message saying that no more colors can be allocated this is
|
|||
|
the problem. There is no good workaround if you are using GD 1.x since for PNG
|
|||
|
the GD 1.x library does not support "True-color". </p><p> The only real solution is to upgrade to GD 2.x to get full true-color
|
|||
|
support. If you are using a background image try to "degrade" it to have a
|
|||
|
smaller color palette or turn of anti-aliasing and you might have enough free
|
|||
|
palette entries to cater for all the colors you want and still use GD 1.x </p><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3>
|
|||
|
<p>This problem is only seen in very, very old installations that use GD 1.x
|
|||
|
library which has been deprecated since around 2005</p>
|
|||
|
</div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.51."><td align="left" valign="top"><a name="id2624988"></a><a name="id2624997"></a><p><b>C.51.</b></p></td><td align="left" valign="top"><p> Can I have labels at an arbitrary angle on the X-axis? </p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Yes, almost any text can be stroked at an arbitrary angle. For example to
|
|||
|
have the labels at 45 degrees angle use </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">...
|
|||
|
$graph->xaxis->SetTickLabels($labels);
|
|||
|
$graph->xaxis->SetLabelAngle(45);
|
|||
|
...</span></pre></td></tr></table></div><div class="note" title="Note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3>
|
|||
|
<p>Internal fonts support 0 and 90 degrees text. If you need to use, say 45
|
|||
|
degree (or any other arbitrary angle), you must use TTF fonts. </p>
|
|||
|
</div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.52."><td align="left" valign="top"><a name="id2625029"></a><a name="id2625031"></a><p><b>C.52.</b></p></td><td align="left" valign="top"><p> How do I invert the Y-scale so that it has the minimum value on top and the
|
|||
|
largest value at the bottom?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> The easiest way to do this is by following a two step process</p><p>a) Negating all Your values and then </p><p>b) Create a callback function for the Y-axis that negates all the display
|
|||
|
values. </p><p> What will happen now is that after the negative values have been feed into
|
|||
|
the graph it will create a scale starting at the lowest value, say -8, then go
|
|||
|
up to the highest, say -1. If these values are then inverted when printed it
|
|||
|
will in affect achieve the inverted axis appearance. The code snippet below
|
|||
|
shows a basic example of this technique. </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
15
|
|||
|
16
|
|||
|
17
|
|||
|
18
|
|||
|
19
|
|||
|
20
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">... // Callback to negate the argument
|
|||
|
function _cb_negate($aVal) {
|
|||
|
return round(-$aVal);
|
|||
|
} // A fake depth curve
|
|||
|
$ydata = ....
|
|||
|
// Negate all data
|
|||
|
$n = count($ydata);
|
|||
|
for($i=0; $i<$n; ++$i) {
|
|||
|
$ydata[$i] = -$ydata[$i];
|
|||
|
}
|
|||
|
|
|||
|
// Basic graph setup
|
|||
|
$graph = new Graph(400,300);
|
|||
|
$graph->SetScale("linlin");
|
|||
|
|
|||
|
// Setup axis
|
|||
|
$graph->yaxis->SetLabelFormatCallback("_cb_negate");
|
|||
|
$plot = new LinePlot($ydata,$xdata);
|
|||
|
$graph->Add($plot);
|
|||
|
$graph->Stroke();</span></pre></td></tr></table></div><p> Two scripts that uses this technique can be found in the
|
|||
|
<code class="filename">Examples/</code> directory in the distribution,
|
|||
|
<code class="filename">"inyaxisex1.php"</code> and
|
|||
|
<code class="filename">"inyaxisex2.php"</code>. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.53."><td align="left" valign="top"><a name="id2625086"></a><a name="id2625089"></a><p><b>C.53.</b></p></td><td align="left" valign="top"><p> Can I have the auto-scaling algorithm restrict itself to whole
|
|||
|
numbers?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Yes, use the "int" scale specification, for example
|
|||
|
<code class="code">$graph->SetScale('inttext')</code> will make the Y-axis have an
|
|||
|
integer scale and the X-axis a text-scale</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.54."><td align="left" valign="top"><a name="id2625104"></a><a name="id2625113"></a><p><b>C.54.</b></p></td><td align="left" valign="top"><p> Is it possible to have horizontal bar graphs?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Yes, Just create a normal bar and call the method
|
|||
|
<code class="code">Set90AndMargin()</code> to rotate the graph.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.55."><td align="left" valign="top"><a name="id2625124"></a><a name="id2625137"></a><p><b>C.55.</b></p></td><td align="left" valign="top"><p> Line weight does not seem to work in my graphs? I specify a thick line but
|
|||
|
still get a thin line?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You have probably enabled Anti-aliasing. If anti-aliasing is enabled setting
|
|||
|
line-weight will have no affect.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.56."><td align="left" valign="top"><a name="id2625155"></a><a name="id2625157"></a><p><b>C.56.</b></p></td><td align="left" valign="top"><p> How can I have more space between the Y-axis and the title? </p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Use the <code class="code">Axis::SetTitleMargin()</code> method. For example to have a 25
|
|||
|
pixels margin for the Y-title you could use:
|
|||
|
</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$mygraph->yaxis->SetTitleMargin(25);</span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.57."><td align="left" valign="top"><a name="id2625168"></a><a name="id2625184"></a><p><b>C.57.</b></p></td><td align="left" valign="top"><p> How can I display both X and Y values above each data point in a line, bar or
|
|||
|
scatter plot?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You need to use a value formatting callback. The callback function is called
|
|||
|
for each data point and is passed the Y-value as argument. This means that if
|
|||
|
You also need to display the x-value it must be available in the callback
|
|||
|
function,perhaps as a global data array. </p><p> Something along the lines of</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
15
|
|||
|
16
|
|||
|
17
|
|||
|
18
|
|||
|
19
|
|||
|
20
|
|||
|
21
|
|||
|
22
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-inlinetags"><?php</span><span class="hl-code">
|
|||
|
</span><span class="hl-var">$datay</span><span class="hl-code"> = </span><span class="hl-reserved">array</span><span class="hl-brackets">(</span><span class="hl-code">...</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$datax</span><span class="hl-code"> = </span><span class="hl-reserved">array</span><span class="hl-brackets">(</span><span class="hl-code">...</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$idx</span><span class="hl-code">=</span><span class="hl-number">0</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-reserved">function</span><span class="hl-code"> </span><span class="hl-identifier">xyCallback</span><span class="hl-brackets">(</span><span class="hl-var">$yval</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-brackets">{</span><span class="hl-code">
|
|||
|
</span><span class="hl-reserved">global</span><span class="hl-code"> </span><span class="hl-var">$datax</span><span class="hl-code">, </span><span class="hl-var">$idx</span><span class="hl-code">;
|
|||
|
</span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-quotes">'</span><span class="hl-string">(</span><span class="hl-quotes">'</span><span class="hl-code">.</span><span class="hl-var">$datax</span><span class="hl-brackets">[</span><span class="hl-var">$idx</span><span class="hl-code">++</span><span class="hl-brackets">]</span><span class="hl-code">.</span><span class="hl-quotes">"</span><span class="hl-string">, </span><span class="hl-var">$yval</span><span class="hl-string">)</span><span class="hl-quotes">"</span><span class="hl-code">;
|
|||
|
</span><span class="hl-brackets">}</span><span class="hl-code">
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Some more code ... </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">Graph</span><span class="hl-brackets">(</span><span class="hl-code">...</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">SetScale</span><span class="hl-brackets">(</span><span class="hl-quotes">"</span><span class="hl-string">intlin</span><span class="hl-quotes">"</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$p1</span><span class="hl-code"> = </span><span class="hl-reserved">new</span><span class="hl-code"> </span><span class="hl-identifier">LinePlot</span><span class="hl-brackets">(</span><span class="hl-var">$datay</span><span class="hl-code">,</span><span class="hl-var">$datax</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$p1</span><span class="hl-code">-></span><span class="hl-identifier">value</span><span class="hl-code">-></span><span class="hl-identifier">SetFormatCallback</span><span class="hl-brackets">(</span><span class="hl-quotes">'</span><span class="hl-string">xyCallback</span><span class="hl-quotes">'</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-var">$p1</span><span class="hl-code">-></span><span class="hl-identifier">value</span><span class="hl-code">-></span><span class="hl-identifier">Show</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
|
|||
|
</span><span class="hl-comment">//</span><span class="hl-comment"> Some more code ... </span><span class="hl-comment"></span><span class="hl-code">
|
|||
|
|
|||
|
</span><span class="hl-var">$graph</span><span class="hl-code">-></span><span class="hl-identifier">Stroke</span><span class="hl-brackets">(</span><span class="hl-brackets">)</span><span class="hl-code">;
|
|||
|
</span><span class="hl-inlinetags">?></span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.58."><td align="left" valign="top"><a name="id2625213"></a><a name="id2625215"></a><p><b>C.58.</b></p></td><td align="left" valign="top"><p> Can I display stock box-charts (open, close, high, low) with JpGraph? </p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Yes, just create a <code class="code">StockPlot()</code> graph.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.59."><td align="left" valign="top"><a name="id2625231"></a><a name="id2625239"></a><p><b>C.59.</b></p></td><td align="left" valign="top"><p> Is there any way to specify a newline in the legend box for a specific
|
|||
|
legend?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Yes. From version 1.8 full multi-line text paragraphs are supported. Just
|
|||
|
make sure that your text uses double-quotes and a newline character. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.60."><td align="left" valign="top"><a name="id2625258"></a><a name="id2625260"></a><p><b>C.60.</b></p></td><td align="left" valign="top"><p> How can I print unicode characters?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Use &#XXXX; format in your strings where XXXX is the decimal value for
|
|||
|
the unicode character. You may find a list of Unicode characters and there
|
|||
|
encodings at <code class="uri"><a class="uri" href="http://www.unicode.org/charts/" target="_top">www.unicode.org</a></code> Please observe that the encoding in the lists are
|
|||
|
given in hexadecimal and these values must be converted to decimal. </p><p> Note: If You are working in an UTF-8 environment then the characters may be
|
|||
|
input directly.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.61."><td align="left" valign="top"><a name="id2625220"></a><a name="id2625295"></a><p><b>C.61.</b></p></td><td align="left" valign="top"><p> My background images doesn't display properly. It just shows a black solid
|
|||
|
square? </p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You are using a very old GD version (probably 2.0.1). Background images only
|
|||
|
work with a truecolor image, (enable the USE_TRUECOLOR constant). Some people
|
|||
|
have reported that it works as long as the background image is not in PNG
|
|||
|
format. The drawback with truecolor images is that truefont doesn't work
|
|||
|
properly in GD versions < 2.0.8 </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.62."><td align="left" valign="top"><a name="id2625314"></a><a name="id2625316"></a><p><b>C.62.</b></p></td><td align="left" valign="top"><p> How do I make each bar in a bar plot have it's own color?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Specify an array as argument to <code class="code">BarPlot::SetColor()</code> as in
|
|||
|
</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$mybarplot->SetColor(array("red","green","blue","gray"));</span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.63."><td align="left" valign="top"><a name="id2625331"></a><a name="id2625341"></a><p><b>C.63.</b></p></td><td align="left" valign="top"><p> How can I adjust the position of the axis title?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> You can add an alignment parameter when you specify the title. You specify
|
|||
|
one of "high", "low" or "center" as in </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$mygraph->xaxis->SetTitle("mytitle","high");
|
|||
|
$mygraph->xaxis->SetTitle("mytitle","center");
|
|||
|
$mygraph->xaxis->SetTitle("mytitle","low");</span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.64."><td align="left" valign="top"><a name="id2625364"></a><a name="id2625367"></a><p><b>C.64.</b></p></td><td align="left" valign="top"><p> How can I change the image format, i.e jpeg, gif or png? </p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Use the <code class="code">Image::SetImgFormat()</code> method at runtime. You can also
|
|||
|
change the default value with the <code class="code">DEFAULT_GFORMAT</code> define in
|
|||
|
jpg-config.php. This is normally set to 'auto' format which means that JpGraph
|
|||
|
will automatically choose the format depending on what is available.</p><p>For example to use the JPEG format :</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$graph->img->SetImgFormat('jpeg');</span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.65."><td align="left" valign="top"><a name="id2625346"></a><a name="id2625403"></a><p><b>C.65.</b></p></td><td align="left" valign="top"><p> How do I specify the font for legends?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Use the Legend::SetFont() method. As in </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$graph->legend->SetFont(FF_FONT1,FS_BOLD);</span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.66."><td align="left" valign="top"><a name="id2625424"></a><a name="id2625426"></a><p><b>C.66.</b></p></td><td align="left" valign="top"><p> When I rotate text and labels the text is not rotated correctly?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Red Hat 7.2 has a bug in it's TTF libraries (FreeType 2.0.3) that comes with
|
|||
|
the distribution. Upgrade to FreeType 2.0.9.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.67."><td align="left" valign="top"><a name="id2625406"></a><a name="id2625445"></a><p><b>C.67.</b></p></td><td align="left" valign="top"><p> When I rotate a paragraph (multi-line) text the paragraph is always left
|
|||
|
aligned even though I have specified another alignment. It seems fine for
|
|||
|
non-rotated paragraphs though. What is the problem? </p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This is a limitation with the current implementation. (The reason is that GD
|
|||
|
does not support inter-paragraph alignment so all that logic is done within the
|
|||
|
libraries string-layout engine. </p><p> At the moment the logic only implements this paragraph alignment for
|
|||
|
non-rotated paragraphs.) For rotated paragraphs left-alignment will always be
|
|||
|
used regardless of specified paragraph alignment.</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.68."><td align="left" valign="top"><a name="id2625472"></a><a name="id2625474"></a><p><b>C.68.</b></p></td><td align="left" valign="top"><p> I have a huge number of data points and I only want labels (which I want to
|
|||
|
specify as text string) and ticks on every n:th data. Can I do this?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Yes. What most users stumble on is the fact that the label array must still
|
|||
|
contain data for all the data points even though only every n:th data label is
|
|||
|
displayed. </p><p> This means that if your original data array only contains just the display
|
|||
|
values it is necessary first to augment the label array with padding spaces to
|
|||
|
fill it out. </p><p> It is then possible to use the method
|
|||
|
<code class="code">Axis::SetTextTickInterval()</code> to specify that only every n:th
|
|||
|
tick+label should be displayed. Something like:
|
|||
|
</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">// Setup the X-axis
|
|||
|
$graph->xaxis->SetTickLabels($datax);
|
|||
|
$graph->xaxis->SetTextTickInterval( ... );</span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.69."><td align="left" valign="top"><a name="id2625497"></a><a name="id2625515"></a><p><b>C.69.</b></p></td><td align="left" valign="top"><p> How can I make the labels have a 1000 comma separator?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> The easiest way is to use the PHP built-in function
|
|||
|
"<code class="code">number_format()</code>" as a callback (see php manual. <code class="uri"><a class="uri" href="http://www.php.net/manual/en/function.number-format.php" target="_top">number_format()</a></code>)</p><p>For example, to have the line plot display values using this format first
|
|||
|
setup and install the callback function as: </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$lineplot->value->SetFormatCallback("number_format");</span></pre></td></tr></table></div><p> If you instead want the Y-axis label to use this kind of formatting install
|
|||
|
the callback using </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$graph->yaxis->SetLabelFormatCallback("number_format");</span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.70."><td align="left" valign="top"><a name="id2625536"></a><a name="id2625562"></a><p><b>C.70.</b></p></td><td align="left" valign="top"><p> The Y2 axis is no longer positioned at the right side of the graph</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This will happen after that You have manually specified the sclae and/or the
|
|||
|
tick spacing. If the user manipulates the default scale the library defaults to
|
|||
|
setting the position of the Y2 axis to the 0 X-position. It is easy to re-adjust
|
|||
|
the Y2 axis position by calling SetPos() as the following code snippet
|
|||
|
demonstrates
|
|||
|
</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$graph->y2axis->SetPos('max');
|
|||
|
$graph->y2axis->SetTitleSide('right');</span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.71."><td align="left" valign="top"><a name="id2625573"></a><a name="id2625587"></a><p><b>C.71.</b></p></td><td align="left" valign="top"><p> How can I include several graphs in the same image?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This can be solved by a bit of extra GD code since the library by default do
|
|||
|
not directly support this functionality. The easiest way to solve this is to
|
|||
|
manually create a big enough empty graph with plain GD commands. Then get the
|
|||
|
image handles from the Stroke() methods in the graphs that should be included.
|
|||
|
It is then possible to use these handles together with the GD copy command and
|
|||
|
copy the individual graphs to the previously created empty large GD image. </p><p> This is illustrated in the following code snippet. In the example below we
|
|||
|
assume that graph1 is the same size as the final combined graph we would like to
|
|||
|
create. This way our combined graph get a background and color as specified in
|
|||
|
the first graph. </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
4
|
|||
|
5
|
|||
|
6
|
|||
|
7
|
|||
|
8
|
|||
|
9
|
|||
|
10
|
|||
|
11
|
|||
|
12
|
|||
|
13
|
|||
|
14
|
|||
|
15
|
|||
|
16
|
|||
|
17
|
|||
|
18
|
|||
|
19
|
|||
|
20
|
|||
|
21
|
|||
|
22
|
|||
|
23
|
|||
|
24
|
|||
|
25
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">// Assume we would like to combine graph1,2 and 3
|
|||
|
|
|||
|
// ...... create graph 1 here.......
|
|||
|
$handle1 = $graph1->Stroke( _IMG_HANDLER);
|
|||
|
|
|||
|
// ...... create graph 2 here.......
|
|||
|
$handle2 = $graph2->Stroke( _IMG_HANDLER);
|
|||
|
|
|||
|
// ...... create graph 3 here.......
|
|||
|
$handle3 = $graph3->Stroke( _IMG_HANDLER);
|
|||
|
|
|||
|
// Now create the "melting graph" which should contain all three graphs
|
|||
|
// $WIDTH1 and $HEIGHT1 are width and height of graph 1 ($handle1)
|
|||
|
// $WIDTH2 and $HEIGHT2 are width and height of graph 2 ($handle2)
|
|||
|
// $WIDTH3 and $HEIGHT3 are width and height of graph 3 ($handle3)
|
|||
|
// $x2,$x3 and $y2,$y3 shift from top left of global graph (ie position of
|
|||
|
// graph2 and graph3 in global graph)
|
|||
|
$image = imagecreatetruecolor($WIDTH1,$HEIGHT1);
|
|||
|
imagecopy($image, $handle1,0, 0, 0, 0, $WIDTH1,$HEIGHT1);
|
|||
|
imagecopy($image, $handle1,$x1,$y1,0,0,$WIDTH2,$HEIGHT2);
|
|||
|
imagecopy($image, $handle1,$x2,$y2,0,0,$WIDTH3,$HEIGHT3);
|
|||
|
|
|||
|
// Stream the result back as a PNG
|
|||
|
image header("Content-type: image/png");
|
|||
|
imagepng ($image);</span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.72."><td align="left" valign="top"><a name="id2625627"></a><a name="id2625629"></a><p><b>C.72.</b></p></td><td align="left" valign="top"><p> How can I have an exploded slice with 3D pie plots?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Use either <code class="code">Pi3DPLot::ExplodeSlice()</code> or
|
|||
|
<code class="code">Pie3DPlot::Explode()</code>
|
|||
|
</p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.73."><td align="left" valign="top"><a name="id2625654"></a><a name="id2625656"></a><p><b>C.73.</b></p></td><td align="left" valign="top"><p> How can I display values for each slice close to the pie?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Use the method <code class="code">PiePlot::value::Show()</code></p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.74."><td align="left" valign="top"><a name="id2625667"></a><a name="id2625678"></a><p><b>C.74.</b></p></td><td align="left" valign="top"><p> How can I change between percentage and absolute values for pie slices?
|
|||
|
</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Use <code class="code">PiePlot::SetValueType($aType)</code> where <code class="code">$aType</code> is
|
|||
|
either <code class="code">PIE_VALUE_ABS</code> or <code class="code">PIE_VALUE_PERCENTAGE</code>. To
|
|||
|
hide/show values on the pie you access the value property of the plot (just like
|
|||
|
in line plots) If you want some special format of the string you also need to
|
|||
|
specify a format string. By default just a number gets printed. If you (for
|
|||
|
example) want percent with a "%" sign you should use a format string like "%d%%"
|
|||
|
(assuming you just want to display whole numbers)
|
|||
|
</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
3
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$mypieplot->value->SetFormat("%d%%");
|
|||
|
$mypieplot->value->Show(); // Defaults to TRUE
|
|||
|
$mypieplot->SetValueType(PIE_VALUE_PERCENTAGE);</span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.75."><td align="left" valign="top"><a name="id2625719"></a><a name="id2625721"></a><p><b>C.75.</b></p></td><td align="left" valign="top"><p> Can I display the actual value as labels on the pie bar instead of the
|
|||
|
percentage?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Yes, use
|
|||
|
</p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$pieplot->SetLabelType(PIE_LABEL_ABS);</span></pre></td></tr></table></div><p> and
|
|||
|
make sure labels are not hidden. </p></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.76."><td align="left" valign="top"><a name="id2625742"></a><a name="id2625744"></a><p><b>C.76.</b></p></td><td align="left" valign="top"><p> How can I adust the start angle of the first slice?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> Use </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$pieplot->SetStartAngle(45);</span></pre></td></tr></table></div></td></tr>
|
|||
|
|
|||
|
<tr class="question" title="C.77."><td align="left" valign="top"><a name="id2625757"></a><a name="id2625764"></a><p><b>C.77.</b></p></td><td align="left" valign="top"><p> When I use IE v5 or v6 I can only save the generated graph image in the
|
|||
|
browser as a BMP file even if it was generated as a JPEG or PNG encoded
|
|||
|
image?</p></td></tr>
|
|||
|
<tr class="answer"><td align="left" valign="top"></td><td align="left" valign="top"><p> This is a bug in the way IE handles HTTP headers. By default the library
|
|||
|
sends no-cache headers to instruct the browser to always make a HTTP request to
|
|||
|
the server. This is necessary since graph scripts normally have the same name
|
|||
|
but the graphs may change over time and we don't want the browser to be fooled
|
|||
|
by thinking it has already fetched the graph before. </p><p> The only known workaround is to tell the library not to send back any
|
|||
|
no-cache headers as illustrated below. </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1
|
|||
|
2
|
|||
|
</pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$graph->img->SetExpired(false);
|
|||
|
$graph->Stroke();</span></pre></td></tr></table></div><p> The <code class="code">SetExpired(false)</code> call instructs the library to not send
|
|||
|
back any has-expired headers.</p></td></tr>
|
|||
|
</tbody></table></div>
|
|||
|
</div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"><a accesskey="u" href="pt09.html">Up</a></td><td width="40%" align="right"> </td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></body></html>
|