├── LICENSE ├── README.txt ├── composer.json ├── phplot ├── COPYING ├── ChangeLog ├── Makefile ├── NEWS.txt ├── NEWS_part1.txt ├── README.txt ├── contrib │ ├── README.txt │ ├── color_range.example.php │ ├── color_range.php │ ├── color_range.test1.php │ ├── color_range.test2.php │ ├── data_table.example1.php │ ├── data_table.example2.php │ ├── data_table.example3.php │ ├── data_table.php │ ├── prune_labels.example.php │ ├── prune_labels.php │ └── prune_labels.test.php ├── phplot.php └── rgb.inc.php └── readme.md /LICENSE: -------------------------------------------------------------------------------- 1 | phplot/COPYING -------------------------------------------------------------------------------- /README.txt: -------------------------------------------------------------------------------- 1 | phplot/README.txt -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "davefx/phplot", 3 | "description": "PHPlot - Create charts in PHP", 4 | "keywords": [ "phplot", "chart" ], 5 | "homepage": "http://phplot.sourceforge.net", 6 | "license": "LGPL", 7 | "require": { 8 | "php": ">5.3.0" 9 | }, 10 | "autoload": { 11 | "classmap": ["phplot/"] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /phplot/COPYING: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 2.1, February 1999 3 | 4 | Copyright (C) 1991, 1999 Free Software Foundation, Inc. 5 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 6 | Everyone is permitted to copy and distribute verbatim copies 7 | of this license document, but changing it is not allowed. 8 | 9 | [This is the first released version of the Lesser GPL. It also counts 10 | as the successor of the GNU Library Public License, version 2, hence 11 | the version number 2.1.] 12 | 13 | Preamble 14 | 15 | The licenses for most software are designed to take away your 16 | freedom to share and change it. By contrast, the GNU General Public 17 | Licenses are intended to guarantee your freedom to share and change 18 | free software--to make sure the software is free for all its users. 19 | 20 | This license, the Lesser General Public License, applies to some 21 | specially designated software packages--typically libraries--of the 22 | Free Software Foundation and other authors who decide to use it. You 23 | can use it too, but we suggest you first think carefully about whether 24 | this license or the ordinary General Public License is the better 25 | strategy to use in any particular case, based on the explanations below. 26 | 27 | When we speak of free software, we are referring to freedom of use, 28 | not price. Our General Public Licenses are designed to make sure that 29 | you have the freedom to distribute copies of free software (and charge 30 | for this service if you wish); that you receive source code or can get 31 | it if you want it; that you can change the software and use pieces of 32 | it in new free programs; and that you are informed that you can do 33 | these things. 34 | 35 | To protect your rights, we need to make restrictions that forbid 36 | distributors to deny you these rights or to ask you to surrender these 37 | rights. These restrictions translate to certain responsibilities for 38 | you if you distribute copies of the library or if you modify it. 39 | 40 | For example, if you distribute copies of the library, whether gratis 41 | or for a fee, you must give the recipients all the rights that we gave 42 | you. You must make sure that they, too, receive or can get the source 43 | code. If you link other code with the library, you must provide 44 | complete object files to the recipients, so that they can relink them 45 | with the library after making changes to the library and recompiling 46 | it. And you must show them these terms so they know their rights. 47 | 48 | We protect your rights with a two-step method: (1) we copyright the 49 | library, and (2) we offer you this license, which gives you legal 50 | permission to copy, distribute and/or modify the library. 51 | 52 | To protect each distributor, we want to make it very clear that 53 | there is no warranty for the free library. Also, if the library is 54 | modified by someone else and passed on, the recipients should know 55 | that what they have is not the original version, so that the original 56 | author's reputation will not be affected by problems that might be 57 | introduced by others. 58 | 59 | Finally, software patents pose a constant threat to the existence of 60 | any free program. We wish to make sure that a company cannot 61 | effectively restrict the users of a free program by obtaining a 62 | restrictive license from a patent holder. Therefore, we insist that 63 | any patent license obtained for a version of the library must be 64 | consistent with the full freedom of use specified in this license. 65 | 66 | Most GNU software, including some libraries, is covered by the 67 | ordinary GNU General Public License. This license, the GNU Lesser 68 | General Public License, applies to certain designated libraries, and 69 | is quite different from the ordinary General Public License. We use 70 | this license for certain libraries in order to permit linking those 71 | libraries into non-free programs. 72 | 73 | When a program is linked with a library, whether statically or using 74 | a shared library, the combination of the two is legally speaking a 75 | combined work, a derivative of the original library. The ordinary 76 | General Public License therefore permits such linking only if the 77 | entire combination fits its criteria of freedom. The Lesser General 78 | Public License permits more lax criteria for linking other code with 79 | the library. 80 | 81 | We call this license the "Lesser" General Public License because it 82 | does Less to protect the user's freedom than the ordinary General 83 | Public License. It also provides other free software developers Less 84 | of an advantage over competing non-free programs. These disadvantages 85 | are the reason we use the ordinary General Public License for many 86 | libraries. However, the Lesser license provides advantages in certain 87 | special circumstances. 88 | 89 | For example, on rare occasions, there may be a special need to 90 | encourage the widest possible use of a certain library, so that it becomes 91 | a de-facto standard. To achieve this, non-free programs must be 92 | allowed to use the library. A more frequent case is that a free 93 | library does the same job as widely used non-free libraries. In this 94 | case, there is little to gain by limiting the free library to free 95 | software only, so we use the Lesser General Public License. 96 | 97 | In other cases, permission to use a particular library in non-free 98 | programs enables a greater number of people to use a large body of 99 | free software. For example, permission to use the GNU C Library in 100 | non-free programs enables many more people to use the whole GNU 101 | operating system, as well as its variant, the GNU/Linux operating 102 | system. 103 | 104 | Although the Lesser General Public License is Less protective of the 105 | users' freedom, it does ensure that the user of a program that is 106 | linked with the Library has the freedom and the wherewithal to run 107 | that program using a modified version of the Library. 108 | 109 | The precise terms and conditions for copying, distribution and 110 | modification follow. Pay close attention to the difference between a 111 | "work based on the library" and a "work that uses the library". The 112 | former contains code derived from the library, whereas the latter must 113 | be combined with the library in order to run. 114 | 115 | GNU LESSER GENERAL PUBLIC LICENSE 116 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 117 | 118 | 0. This License Agreement applies to any software library or other 119 | program which contains a notice placed by the copyright holder or 120 | other authorized party saying it may be distributed under the terms of 121 | this Lesser General Public License (also called "this License"). 122 | Each licensee is addressed as "you". 123 | 124 | A "library" means a collection of software functions and/or data 125 | prepared so as to be conveniently linked with application programs 126 | (which use some of those functions and data) to form executables. 127 | 128 | The "Library", below, refers to any such software library or work 129 | which has been distributed under these terms. A "work based on the 130 | Library" means either the Library or any derivative work under 131 | copyright law: that is to say, a work containing the Library or a 132 | portion of it, either verbatim or with modifications and/or translated 133 | straightforwardly into another language. (Hereinafter, translation is 134 | included without limitation in the term "modification".) 135 | 136 | "Source code" for a work means the preferred form of the work for 137 | making modifications to it. For a library, complete source code means 138 | all the source code for all modules it contains, plus any associated 139 | interface definition files, plus the scripts used to control compilation 140 | and installation of the library. 141 | 142 | Activities other than copying, distribution and modification are not 143 | covered by this License; they are outside its scope. The act of 144 | running a program using the Library is not restricted, and output from 145 | such a program is covered only if its contents constitute a work based 146 | on the Library (independent of the use of the Library in a tool for 147 | writing it). Whether that is true depends on what the Library does 148 | and what the program that uses the Library does. 149 | 150 | 1. You may copy and distribute verbatim copies of the Library's 151 | complete source code as you receive it, in any medium, provided that 152 | you conspicuously and appropriately publish on each copy an 153 | appropriate copyright notice and disclaimer of warranty; keep intact 154 | all the notices that refer to this License and to the absence of any 155 | warranty; and distribute a copy of this License along with the 156 | Library. 157 | 158 | You may charge a fee for the physical act of transferring a copy, 159 | and you may at your option offer warranty protection in exchange for a 160 | fee. 161 | 162 | 2. You may modify your copy or copies of the Library or any portion 163 | of it, thus forming a work based on the Library, and copy and 164 | distribute such modifications or work under the terms of Section 1 165 | above, provided that you also meet all of these conditions: 166 | 167 | a) The modified work must itself be a software library. 168 | 169 | b) You must cause the files modified to carry prominent notices 170 | stating that you changed the files and the date of any change. 171 | 172 | c) You must cause the whole of the work to be licensed at no 173 | charge to all third parties under the terms of this License. 174 | 175 | d) If a facility in the modified Library refers to a function or a 176 | table of data to be supplied by an application program that uses 177 | the facility, other than as an argument passed when the facility 178 | is invoked, then you must make a good faith effort to ensure that, 179 | in the event an application does not supply such function or 180 | table, the facility still operates, and performs whatever part of 181 | its purpose remains meaningful. 182 | 183 | (For example, a function in a library to compute square roots has 184 | a purpose that is entirely well-defined independent of the 185 | application. Therefore, Subsection 2d requires that any 186 | application-supplied function or table used by this function must 187 | be optional: if the application does not supply it, the square 188 | root function must still compute square roots.) 189 | 190 | These requirements apply to the modified work as a whole. If 191 | identifiable sections of that work are not derived from the Library, 192 | and can be reasonably considered independent and separate works in 193 | themselves, then this License, and its terms, do not apply to those 194 | sections when you distribute them as separate works. But when you 195 | distribute the same sections as part of a whole which is a work based 196 | on the Library, the distribution of the whole must be on the terms of 197 | this License, whose permissions for other licensees extend to the 198 | entire whole, and thus to each and every part regardless of who wrote 199 | it. 200 | 201 | Thus, it is not the intent of this section to claim rights or contest 202 | your rights to work written entirely by you; rather, the intent is to 203 | exercise the right to control the distribution of derivative or 204 | collective works based on the Library. 205 | 206 | In addition, mere aggregation of another work not based on the Library 207 | with the Library (or with a work based on the Library) on a volume of 208 | a storage or distribution medium does not bring the other work under 209 | the scope of this License. 210 | 211 | 3. You may opt to apply the terms of the ordinary GNU General Public 212 | License instead of this License to a given copy of the Library. To do 213 | this, you must alter all the notices that refer to this License, so 214 | that they refer to the ordinary GNU General Public License, version 2, 215 | instead of to this License. (If a newer version than version 2 of the 216 | ordinary GNU General Public License has appeared, then you can specify 217 | that version instead if you wish.) Do not make any other change in 218 | these notices. 219 | 220 | Once this change is made in a given copy, it is irreversible for 221 | that copy, so the ordinary GNU General Public License applies to all 222 | subsequent copies and derivative works made from that copy. 223 | 224 | This option is useful when you wish to copy part of the code of 225 | the Library into a program that is not a library. 226 | 227 | 4. You may copy and distribute the Library (or a portion or 228 | derivative of it, under Section 2) in object code or executable form 229 | under the terms of Sections 1 and 2 above provided that you accompany 230 | it with the complete corresponding machine-readable source code, which 231 | must be distributed under the terms of Sections 1 and 2 above on a 232 | medium customarily used for software interchange. 233 | 234 | If distribution of object code is made by offering access to copy 235 | from a designated place, then offering equivalent access to copy the 236 | source code from the same place satisfies the requirement to 237 | distribute the source code, even though third parties are not 238 | compelled to copy the source along with the object code. 239 | 240 | 5. A program that contains no derivative of any portion of the 241 | Library, but is designed to work with the Library by being compiled or 242 | linked with it, is called a "work that uses the Library". Such a 243 | work, in isolation, is not a derivative work of the Library, and 244 | therefore falls outside the scope of this License. 245 | 246 | However, linking a "work that uses the Library" with the Library 247 | creates an executable that is a derivative of the Library (because it 248 | contains portions of the Library), rather than a "work that uses the 249 | library". The executable is therefore covered by this License. 250 | Section 6 states terms for distribution of such executables. 251 | 252 | When a "work that uses the Library" uses material from a header file 253 | that is part of the Library, the object code for the work may be a 254 | derivative work of the Library even though the source code is not. 255 | Whether this is true is especially significant if the work can be 256 | linked without the Library, or if the work is itself a library. The 257 | threshold for this to be true is not precisely defined by law. 258 | 259 | If such an object file uses only numerical parameters, data 260 | structure layouts and accessors, and small macros and small inline 261 | functions (ten lines or less in length), then the use of the object 262 | file is unrestricted, regardless of whether it is legally a derivative 263 | work. (Executables containing this object code plus portions of the 264 | Library will still fall under Section 6.) 265 | 266 | Otherwise, if the work is a derivative of the Library, you may 267 | distribute the object code for the work under the terms of Section 6. 268 | Any executables containing that work also fall under Section 6, 269 | whether or not they are linked directly with the Library itself. 270 | 271 | 6. As an exception to the Sections above, you may also combine or 272 | link a "work that uses the Library" with the Library to produce a 273 | work containing portions of the Library, and distribute that work 274 | under terms of your choice, provided that the terms permit 275 | modification of the work for the customer's own use and reverse 276 | engineering for debugging such modifications. 277 | 278 | You must give prominent notice with each copy of the work that the 279 | Library is used in it and that the Library and its use are covered by 280 | this License. You must supply a copy of this License. If the work 281 | during execution displays copyright notices, you must include the 282 | copyright notice for the Library among them, as well as a reference 283 | directing the user to the copy of this License. Also, you must do one 284 | of these things: 285 | 286 | a) Accompany the work with the complete corresponding 287 | machine-readable source code for the Library including whatever 288 | changes were used in the work (which must be distributed under 289 | Sections 1 and 2 above); and, if the work is an executable linked 290 | with the Library, with the complete machine-readable "work that 291 | uses the Library", as object code and/or source code, so that the 292 | user can modify the Library and then relink to produce a modified 293 | executable containing the modified Library. (It is understood 294 | that the user who changes the contents of definitions files in the 295 | Library will not necessarily be able to recompile the application 296 | to use the modified definitions.) 297 | 298 | b) Use a suitable shared library mechanism for linking with the 299 | Library. A suitable mechanism is one that (1) uses at run time a 300 | copy of the library already present on the user's computer system, 301 | rather than copying library functions into the executable, and (2) 302 | will operate properly with a modified version of the library, if 303 | the user installs one, as long as the modified version is 304 | interface-compatible with the version that the work was made with. 305 | 306 | c) Accompany the work with a written offer, valid for at 307 | least three years, to give the same user the materials 308 | specified in Subsection 6a, above, for a charge no more 309 | than the cost of performing this distribution. 310 | 311 | d) If distribution of the work is made by offering access to copy 312 | from a designated place, offer equivalent access to copy the above 313 | specified materials from the same place. 314 | 315 | e) Verify that the user has already received a copy of these 316 | materials or that you have already sent this user a copy. 317 | 318 | For an executable, the required form of the "work that uses the 319 | Library" must include any data and utility programs needed for 320 | reproducing the executable from it. However, as a special exception, 321 | the materials to be distributed need not include anything that is 322 | normally distributed (in either source or binary form) with the major 323 | components (compiler, kernel, and so on) of the operating system on 324 | which the executable runs, unless that component itself accompanies 325 | the executable. 326 | 327 | It may happen that this requirement contradicts the license 328 | restrictions of other proprietary libraries that do not normally 329 | accompany the operating system. Such a contradiction means you cannot 330 | use both them and the Library together in an executable that you 331 | distribute. 332 | 333 | 7. You may place library facilities that are a work based on the 334 | Library side-by-side in a single library together with other library 335 | facilities not covered by this License, and distribute such a combined 336 | library, provided that the separate distribution of the work based on 337 | the Library and of the other library facilities is otherwise 338 | permitted, and provided that you do these two things: 339 | 340 | a) Accompany the combined library with a copy of the same work 341 | based on the Library, uncombined with any other library 342 | facilities. This must be distributed under the terms of the 343 | Sections above. 344 | 345 | b) Give prominent notice with the combined library of the fact 346 | that part of it is a work based on the Library, and explaining 347 | where to find the accompanying uncombined form of the same work. 348 | 349 | 8. You may not copy, modify, sublicense, link with, or distribute 350 | the Library except as expressly provided under this License. Any 351 | attempt otherwise to copy, modify, sublicense, link with, or 352 | distribute the Library is void, and will automatically terminate your 353 | rights under this License. However, parties who have received copies, 354 | or rights, from you under this License will not have their licenses 355 | terminated so long as such parties remain in full compliance. 356 | 357 | 9. You are not required to accept this License, since you have not 358 | signed it. However, nothing else grants you permission to modify or 359 | distribute the Library or its derivative works. These actions are 360 | prohibited by law if you do not accept this License. Therefore, by 361 | modifying or distributing the Library (or any work based on the 362 | Library), you indicate your acceptance of this License to do so, and 363 | all its terms and conditions for copying, distributing or modifying 364 | the Library or works based on it. 365 | 366 | 10. Each time you redistribute the Library (or any work based on the 367 | Library), the recipient automatically receives a license from the 368 | original licensor to copy, distribute, link with or modify the Library 369 | subject to these terms and conditions. You may not impose any further 370 | restrictions on the recipients' exercise of the rights granted herein. 371 | You are not responsible for enforcing compliance by third parties with 372 | this License. 373 | 374 | 11. If, as a consequence of a court judgment or allegation of patent 375 | infringement or for any other reason (not limited to patent issues), 376 | conditions are imposed on you (whether by court order, agreement or 377 | otherwise) that contradict the conditions of this License, they do not 378 | excuse you from the conditions of this License. If you cannot 379 | distribute so as to satisfy simultaneously your obligations under this 380 | License and any other pertinent obligations, then as a consequence you 381 | may not distribute the Library at all. For example, if a patent 382 | license would not permit royalty-free redistribution of the Library by 383 | all those who receive copies directly or indirectly through you, then 384 | the only way you could satisfy both it and this License would be to 385 | refrain entirely from distribution of the Library. 386 | 387 | If any portion of this section is held invalid or unenforceable under any 388 | particular circumstance, the balance of the section is intended to apply, 389 | and the section as a whole is intended to apply in other circumstances. 390 | 391 | It is not the purpose of this section to induce you to infringe any 392 | patents or other property right claims or to contest validity of any 393 | such claims; this section has the sole purpose of protecting the 394 | integrity of the free software distribution system which is 395 | implemented by public license practices. Many people have made 396 | generous contributions to the wide range of software distributed 397 | through that system in reliance on consistent application of that 398 | system; it is up to the author/donor to decide if he or she is willing 399 | to distribute software through any other system and a licensee cannot 400 | impose that choice. 401 | 402 | This section is intended to make thoroughly clear what is believed to 403 | be a consequence of the rest of this License. 404 | 405 | 12. If the distribution and/or use of the Library is restricted in 406 | certain countries either by patents or by copyrighted interfaces, the 407 | original copyright holder who places the Library under this License may add 408 | an explicit geographical distribution limitation excluding those countries, 409 | so that distribution is permitted only in or among countries not thus 410 | excluded. In such case, this License incorporates the limitation as if 411 | written in the body of this License. 412 | 413 | 13. The Free Software Foundation may publish revised and/or new 414 | versions of the Lesser General Public License from time to time. 415 | Such new versions will be similar in spirit to the present version, 416 | but may differ in detail to address new problems or concerns. 417 | 418 | Each version is given a distinguishing version number. If the Library 419 | specifies a version number of this License which applies to it and 420 | "any later version", you have the option of following the terms and 421 | conditions either of that version or of any later version published by 422 | the Free Software Foundation. If the Library does not specify a 423 | license version number, you may choose any version ever published by 424 | the Free Software Foundation. 425 | 426 | 14. If you wish to incorporate parts of the Library into other free 427 | programs whose distribution conditions are incompatible with these, 428 | write to the author to ask for permission. For software which is 429 | copyrighted by the Free Software Foundation, write to the Free 430 | Software Foundation; we sometimes make exceptions for this. Our 431 | decision will be guided by the two goals of preserving the free status 432 | of all derivatives of our free software and of promoting the sharing 433 | and reuse of software generally. 434 | 435 | NO WARRANTY 436 | 437 | 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO 438 | WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. 439 | EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR 440 | OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY 441 | KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE 442 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 443 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE 444 | LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME 445 | THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 446 | 447 | 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN 448 | WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY 449 | AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU 450 | FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR 451 | CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE 452 | LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING 453 | RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A 454 | FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF 455 | SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 456 | DAMAGES. 457 | 458 | END OF TERMS AND CONDITIONS 459 | 460 | How to Apply These Terms to Your New Libraries 461 | 462 | If you develop a new library, and you want it to be of the greatest 463 | possible use to the public, we recommend making it free software that 464 | everyone can redistribute and change. You can do so by permitting 465 | redistribution under these terms (or, alternatively, under the terms of the 466 | ordinary General Public License). 467 | 468 | To apply these terms, attach the following notices to the library. It is 469 | safest to attach them to the start of each source file to most effectively 470 | convey the exclusion of warranty; and each file should have at least the 471 | "copyright" line and a pointer to where the full notice is found. 472 | 473 | 474 | Copyright (C) 475 | 476 | This library is free software; you can redistribute it and/or 477 | modify it under the terms of the GNU Lesser General Public 478 | License as published by the Free Software Foundation; either 479 | version 2.1 of the License, or (at your option) any later version. 480 | 481 | This library is distributed in the hope that it will be useful, 482 | but WITHOUT ANY WARRANTY; without even the implied warranty of 483 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 484 | Lesser General Public License for more details. 485 | 486 | You should have received a copy of the GNU Lesser General Public 487 | License along with this library; if not, write to the Free Software 488 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 489 | 490 | Also add information on how to contact you by electronic and paper mail. 491 | 492 | You should also get your employer (if you work as a programmer) or your 493 | school, if any, to sign a "copyright disclaimer" for the library, if 494 | necessary. Here is a sample; alter the names: 495 | 496 | Yoyodyne, Inc., hereby disclaims all copyright interest in the 497 | library `Frob' (a library for tweaking knobs) written by James Random Hacker. 498 | 499 | , 1 April 1990 500 | Ty Coon, President of Vice 501 | 502 | That's all there is to it! 503 | 504 | 505 | -------------------------------------------------------------------------------- /phplot/ChangeLog: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davefx/PHPlot/8399b7b18ebc542ad4cc2796c348b03ba029be53/phplot/ChangeLog -------------------------------------------------------------------------------- /phplot/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for release of PHPLot 2 | # $Id: Makefile 1776 2015-11-03 00:22:47Z lbayuk $ 3 | 4 | # Project name: 5 | PROJ=phplot 6 | 7 | # List of text files to release, and do CRLF line ending 8 | # conversions in the ZIP release only: 9 | REL_TXTFILES=COPYING ChangeLog NEWS.txt README.txt NEWS_part1.txt 10 | # List of all top-level files to release: 11 | REL=$(REL_TXTFILES) phplot.php rgb.inc.php 12 | 13 | # Contrib files to get CRLF line ending conversion in the Zip release: 14 | REL_CONTRIB_TXTFILES=contrib/README.txt 15 | # Contrib files to release: 16 | REL_CONTRIB=$(REL_CONTRIB_TXTFILES) \ 17 | contrib/color_range.example.php \ 18 | contrib/color_range.php \ 19 | contrib/color_range.test1.php \ 20 | contrib/color_range.test2.php \ 21 | contrib/data_table.example1.php \ 22 | contrib/data_table.example2.php \ 23 | contrib/data_table.example3.php \ 24 | contrib/data_table.php \ 25 | contrib/prune_labels.example.php \ 26 | contrib/prune_labels.php \ 27 | contrib/prune_labels.test.php \ 28 | 29 | 30 | # Temporary directory for building releases. Can be relative. 31 | # Release packages will be left here too. 32 | TMP=../tmp 33 | 34 | # Release directory name. VER comes from command line on "make VER=xxx release" 35 | RDIR=$(PROJ)-$(VER) 36 | # Release directory path: 37 | RDIRPATH=$(TMP)/$(RDIR) 38 | 39 | # For phpDocumentor2: 40 | # Path or name of php cli: 41 | PHP=php 42 | # Example command for phpDocumentor2 installed from unpacked release: 43 | #PHPDOCUMENTOR=/opt/phpdoc/bin/phpdoc run 44 | # Example command for phpDocumentor2 running from the PHAR package: 45 | PHPDOCUMENTOR=/opt/phpdoc/phpDocumentor.phar 46 | # phpDocumentor template to use: 47 | TEMPLATE=clean 48 | # Where to place the phpDocumentor output. 49 | PHPDOCDIR=../../docs 50 | 51 | 52 | default: 53 | @echo "Usage: make VER=v release : Make release packages" 54 | @echo " Example: make VER=5.0.1 release" 55 | @echo "Usage: make phpdoc : Make phpDocumentor2 docs" 56 | @echo " Specify PHPDOCDIR=path for destination directory" 57 | @echo " Specify PHP=command for the PHP CLI if necessary." 58 | 59 | 60 | release: 61 | @if [[ x$(VER) = x ]]; then echo "Error: must set VER variable"; exit 1; fi 62 | mkdir -p $(RDIRPATH) $(RDIRPATH)/contrib 63 | cp -v -p $(REL) $(RDIRPATH) 64 | cp -v -p $(REL_CONTRIB) $(RDIRPATH)/contrib 65 | (cd $(TMP); tar -cvzf $(RDIR).tar.gz --owner=0 --group=0 $(RDIR); ) 66 | (cd $(RDIRPATH); for f in $(REL_TXTFILES) $(REL_CONTRIB_TXTFILES);do todos < $$f > convert.tmp && mv -f convert.tmp $$f; done; ) 67 | (cd $(TMP); zip -r $(RDIR).zip $(RDIR); ) 68 | rm -rf $(RDIRPATH) 69 | @echo "Release packages are: $(TMP)/$(RDIR).zip" 70 | @echo " and: $(TMP)/$(RDIR).tar.gz" 71 | 72 | phpdoc: 73 | mkdir -p $(PHPDOCDIR) 74 | $(PHP) $(PHPDOCUMENTOR) --template=$(TEMPLATE) -f phplot.php -t $(PHPDOCDIR) 75 | 76 | -------------------------------------------------------------------------------- /phplot/NEWS.txt: -------------------------------------------------------------------------------- 1 | This is the NEWS file for PHPlot, with release documentation. 2 | The project web site is http://sourceforge.net/projects/phplot/ 3 | The project home page is http://phplot.sourceforge.net/ 4 | Refer the the ChangeLog file for detailed source changes. 5 | See NEWS_part1.txt for older release documentation. 6 | ----------------------------------------------------------------------------- 7 | 8 | 2015-11-01 Release 6.2.0 9 | 10 | === Overview: 11 | 12 | This is the current stable release of PHPlot. This is the first release 13 | that will work with the upcoming PHP-7. This release also adds two new plot 14 | types. 15 | 16 | The PHPlot Reference Manual has been updated to match this release. 17 | 18 | === Cautions, Important Notes, and Compatibility Issues: 19 | 20 | PHP-7 deprecated use of older-style class constructor method names, where 21 | the constructor name matches the class name. The PHPlot class constructor 22 | name in this release has been fixed to work with PHP-7. This release 23 | also works with PHP-5.4, 5.5, and 5.6. However, there is a compatibility 24 | issue with extended classes. This applies even if you are using PHP-5. 25 | 26 | If you define a class which extends the PHPlot class, you must use this 27 | syntax to call the PHPlot constructor from your class constructor: 28 | parent::__construct(...); // Call parent class constructor 29 | This syntax also works in previous releases of PHPlot. However, the 30 | following syntax also worked in older releases, and will no longer work: 31 | $this->PHPlot(...); // Do Not Use This to call parent class constructor 32 | or: parent::PHPlot(...); // Do Not Use This Either 33 | You must use the correct syntax parent::__construct() even if using PHP-5. 34 | 35 | If you are using PHP-7 with PHPlot, here are a few other items to be aware of. 36 | (Some of these affected the PHPlot test suite.) 37 | 38 | + PHPlot uses is_numeric() to check for missing points in the data array. 39 | Starting with PHP-7, hexadecimal strings are no longer considered numeric. 40 | This means if your data array contains the string "0x10", for example, PHPlot 41 | will consider that to be the number 16 when using PHP-5.x, but will treat it 42 | as a missing point with PHP-7. (Unquoted hexadecimal values are still numbers.) 43 | 44 | + PHP-7 no longer allows multiple function parameters with the same name. 45 | A typical case which fails in PHP-7 is: 46 | function myfunction($s, $unused, $unused); // Fails in PHP-7 47 | This broke some PHPlot Test Suite scripts that implemented PHPlot callbacks 48 | with unused parameters. 49 | 50 | + New objects cannot be assigned by reference. Very old versions of the 51 | PHPlot Reference Manual had this syntax (and there may still be some old 52 | versions out there): 53 | $plot =& new PHPlot(600, 400); // Do not use & 54 | 55 | + Division by zero no longer results in E_WARNING, but you end up with one 56 | of the special float values +INF, -INF, or NAN instead. 57 | 58 | 59 | === Bugs Fixed in 6.2.0: 60 | 61 | Fixed bug #170 "replace eval() ...": 62 | This was a request to remove use of eval() from SetDashedStyle(), because 63 | eval() makes people nervous about security, and is not supported by some 64 | Virtual Machines. Removed eval() by using a string template instead of a 65 | code string for the dashed line pattern. There are no changes in usage or 66 | behavior. 67 | 68 | Fixed bug #172 "Fixes for PHP7": 69 | This release now works with PHP-7 (currently pre-release). The constructor 70 | name was changed; there were no problems with the rest of the code. 71 | (Although several scripts in the PHPlot Test Suite also had to be fixed.) 72 | Any class that extends PHPlot must now use the correct syntax to call the 73 | parent constructor: parent::__construct(...). If they used the old syntax 74 | $this->PHPlot(...) they will not work (even with PHP-5.x). 75 | 76 | 77 | === New features in 6.2.0: 78 | 79 | Feature Request #55 "Method documentation in PHPDoc format": 80 | PHPlot now uses "phpdoc"-style comments in the code, which apparently is 81 | supported by some editors/IDEs. Note that the PHPlot Reference Manual does 82 | currently make use of these comments. 83 | 84 | Feature Request #56 "Hidden Y values when zero": 85 | The request was for a way to hide Y label values when zero, but the 86 | implementation is much more general. When using 'printf' label formatting 87 | type, you can now specify 1, 2, or 3 separate format strings. These are 88 | applied in the same way spreadsheets support cell format strings: which 89 | format is used depends on the sign of the value. 90 | 91 | Feature Request #57 "squarefilled plot type": 92 | Two new plot types are added: 'squaredarea' and 'stackedsquaredarea'. 93 | These are like area and stackedarea, but the edges are stepped like 94 | 'squared' plots. 95 | 96 | Feature Request #58 "Data borders for area plot types": 97 | After data borders support was added to the two new plot types 'squaredarea' 98 | and 'stackedsquaredarea', this was extended to the existing, similar plot 99 | types 'area' and 'stackedarea'. Data borders are off by default for all 4 100 | plot types. 101 | 102 | ----------------------------------------------------------------------------- 103 | 104 | 2013-05-11 Release 6.1.0 105 | 106 | === Overview: 107 | 108 | This is the current stable release of PHPlot. This release includes two new 109 | plot type features (which were not completed in time to make it into 110 | PHPlot-6.0.0). 111 | 112 | The PHPlot Reference Manual has been updated to match this release. 113 | 114 | 115 | === Cautions, Important Notes, and Compatibility Issues: 116 | 117 | There are no new compatibility issues in this release. However, if 118 | upgrading from PHPlot-5.8.0 or older, please read the Cautions, Important 119 | Notes, and Compatibility Issues from the PHPlot-6.0.0 release. Everything 120 | there is still applicable. 121 | 122 | 123 | === Bugs Fixed in 6.1.0: 124 | 125 | (none) 126 | 127 | 128 | === New features in 6.1.0: 129 | 130 | Feature Request #47 "Extend horizontal plots to more types": 131 | This feature request was mostly implemented in PHPlot-6.0.0, except for 132 | horizontal error plots, which are now implemented. A new data type 133 | 'data-data-yx-error' is used for horizontal error plots of type lines, 134 | points, and linepoints. 135 | 136 | Feature request #52 "Box Plots": 137 | A new plot type 'boxes' is added. This produces a Box Plot, which is used 138 | to present a 5-number statistical summary of a data set. 139 | 140 | 141 | ----------------------------------------------------------------------------- 142 | 143 | 2013-04-03 Release 6.0.0 144 | 145 | === Overview: 146 | 147 | This is the current stable release of PHPlot. This release includes a 148 | significant rewrite how PHPlot automatically calculates the plot area range 149 | and tick increments from the data points. A number of new features and bug 150 | fixes are also included. 151 | 152 | The PHPlot Reference Manual has been updated to match this release. A 153 | previously-experimental feature to help create HTML image maps is now 154 | fully documented in the manual. 155 | 156 | 157 | === Cautions, Important Notes, and Compatibility Issues: 158 | 159 | There are some important compatibility issues you need to be aware of 160 | before upgrading to PHPlot-6.0.0 from any previous version. Many scripts 161 | will produce different-looking plots with PHPlot-6.0.0 compared to earlier 162 | versions. This is mostly due to changes in the automatic plot range and 163 | tick increment calculations. Also, some scripts may fail, if they access 164 | PHPlot class internal variables (properties) which have been changed to 165 | have 'protected' visibility. See the details below. 166 | 167 | + Plot range calculations changed 168 | 169 | PHPlot-6.0.0 uses a completely new method to calculate each of the 4 limits 170 | of the plot area which are not defined using SetPlotAreaWorld(). As a 171 | result, most plots that don't use SetPlotAreaWorld() with all 4 coordinates 172 | given will look different under PHPlot-6.0.0. The two most notable changes 173 | are that PHPlot-6.0.0 will usually stretch the range to include zero (if 174 | the range does not already include zero), and under most conditions will 175 | ensure that the X axis and Y axis both start and end at a tick mark position 176 | (even if tick marks and labels are not visible). See bug #101 below. 177 | 178 | + Tick increment calculations changed 179 | 180 | PHPlot-6.0.0 uses a completely new method to calculate tick increments 181 | along the X axis and Y axis. This only occurs if the tick increments have 182 | not been set using SetXTickIncrement() or SetNumXTicks() for X, and 183 | SetYTickIncrement() or SetNumXTicks() for Y. If you let PHPlot calculate 184 | the tick increments, your plot will likely have fewer or more tick 185 | intervals than before, and the tick increment will be different. In 186 | general, PHPlot-6.0.0 makes much better choices for tick increment. 187 | See bug #132 below. 188 | 189 | + Class variable visibility changed 190 | 191 | Most PHPlot class variables now have 'protected' visibility, so they are no 192 | longer accessible from scripts that use the class. If your script directly 193 | accesses PHPlot class variables - other than those documented in the manual 194 | for 'tuning' - your script will not work with PHPlot-6.0.0. This change was 195 | necessary because some internal class variables change in each PHPlot release, 196 | and it is impossible to maintain compatibility with direct access to all these 197 | class variables. If your script breaks because of variable visibility changes, 198 | please: (1) see if you can use a public PHPlot class function instead, or 199 | (2) post a message to the PHPlot help forum explaining why you need access to 200 | a particular class variable. 201 | 202 | + SetPlotAreaWorld() now validates arguments 203 | 204 | Starting with PHPlot-6.0.0, the SetPlotAreaWorld() function checks non-NULL 205 | arguments for validity. For both X and Y, it is required that min < max if 206 | both are specified. If you have a script that calls SetPlotAreaWorld() with 207 | max <= min for either X or Y, that script will now fail. On the other hand, 208 | some valid cases where you specify only one end of a range would previously 209 | fail and now work. 210 | 211 | + SetRGBArray() now validates argument 212 | 213 | If you use SetRGBArray() to load a custom color map but pass an invalid 214 | argument (not an array or one of the known keywords), PHPlot will now fail 215 | with an error message. In previous releases, a default black/white color 216 | map was loaded in that case, with no error reported. 217 | 218 | + Removed order dependency: number of ticks and tick increment 219 | 220 | If you want to control the tick increments (rather than letting PHPlot 221 | calculate them), you should set either the number of ticks (SetNumXTicks(), 222 | SetNumYTicks()) or the tick increment (SetXTickIncrement(), 223 | SetYTickIncrement()), but not both, for each axis. If you do set both, 224 | PHPlot-5.8.0 and earlier will use the last setting you made, and ignore the 225 | other. PHPlot-6.0.0 gives priority to the tick increment setting and 226 | ignores the number of ticks, regardless of the order. (The new behavior is 227 | consistent with the PHPlot design goal that you can use the various Set*() 228 | functions in any order and get the same plot.) 229 | 230 | 231 | === Bugs Fixed in 6.0.0: 232 | 233 | Fixed bug #101 Fix automatic Y range calculations": 234 | PHPlot now calculates the Y (and X) ranges using a completely different 235 | method, which is described in the manual. There are new functions to 'tune' 236 | the algorithm used, and of course you can still set the range limits manually. 237 | In most cases, PHPlot now makes much better choices for the plot range limits. 238 | 239 | Fixed bug #132 "Improve tick interval calculations": 240 | PHPlot now by default picks a tick increment which is 1, 2, or 5 times a 241 | power of 10, for much more 'natural' results. There are alternate 242 | algorithms for selecting a 'binary' (power of 2) or date/time-based tick 243 | increment instead. Rather than simply dividing the plot range by 10, PHPlot 244 | now selects a tick increment based on the above requirement and which 245 | results in at least 8 (by default) tick intervals. Of course, you can 246 | still specify the tick increment(s) directly. 247 | 248 | Fixed bug #164 "Calculated defaults applied to subsequent plots": 249 | This has been fixed for the cases of grid visibility, X data label angle, 250 | and label format. A new bug #168 was written for a remaining issue with 251 | label position defaults. This only apples when creating multiple plots on a 252 | single image (overlay or side-by-side). 253 | 254 | Fixed bug #165 "Missing axis labels on some empty plots": 255 | In some cases, X axis labels would be absent for a plot with an empty data 256 | array. PHPlot will now draw the axis labels even when the data array is empty. 257 | 258 | Fixed bug #166 "Legend, UsePointShapes, and shape='none'": 259 | PHPlot will now fall back to using a point marker in the legend when doing 260 | a linepoints plot with a dataset using 'none' as the point shape (rather 261 | than doing no marker at all). This only applies with SetLegendUseShapes(True). 262 | 263 | Fixed bug #167 "Fails to find a default font on Ubuntu": 264 | Ubuntu (via Debian) changed the installation path for the TrueType font 265 | that PHPlot used as a default, causing font selection to fail. The new 266 | font installation path has been added to the search list, and now PHPlot 267 | can find the default TrueType font on Ubuntu. 268 | 269 | 270 | === New features in 6.0.0: 271 | 272 | Feature request #29 "Finer control over plot element colors": 273 | This was an open-ended feature request that is partially implemented and 274 | now closed. New functions were added to control element colors. (Some other 275 | functions were added in previous releases.) In PHPlot-6.0.0, these functions 276 | were added: SetLegendBgColor() for legend background color; 277 | SetLegendTextColor() for legend text color, and functions for pie chart 278 | border colors (see feature request #46 below). 279 | 280 | Feature request #45 "Control pie chart start angle": 281 | Implemented with new functions SetPieStartAngle() and SetPieDirection(). 282 | The angle for the first segment, and the direction (clockwise or 283 | counter-clockwise) can now be set for pie charts. 284 | 285 | Feature request #46 "Control pie chart borders": 286 | Implemented with new functions SetDrawPieBorders() and SetPieBorderColor(). 287 | Pie segment borders can now be on (default for unshaded) or off (default for 288 | shaded), and the color can be set independent of other elements. 289 | 290 | Feature request #47 "Extend horizontal plots to more types": 291 | This is partially implemented. Horizontal lines, linepoints, and points plots 292 | are now implemented. Error plot versions of those horizontal plot types are 293 | not yet implemented, but will probably be in the next release 6.1.0 (with 294 | the introduction of a new data type). 295 | 296 | Note: In implementing feature request #47, the code for 'error' and 297 | 'non-error' versions of the 3 plot types above were merged. A side effect 298 | of this is that data value labels (the labels within the plot area, 299 | identifying the data value at each point) now work for error plots, if 300 | enabled. However, the default label position at 90 degrees will be crossed 301 | by the positive error bar. To avoid this, you can use the tuning variable 302 | data_value_label_angle; for example setting it to 45 degrees. 303 | 304 | Feature request #50 "Control legend colorbox borders": 305 | Implemented with new function SetLegendColorboxBorders(). There are now 3 306 | choices for the borders around color boxes in the legend: 1) use the 'text' 307 | color (the default, and compatible with PHPlot-5.8.0 and older); 2) use 308 | data border colors; and 3) disable the borders. 309 | 310 | Note: Along with the implementation of feature request #50, a new function 311 | SetDrawDataBorders() was added to control drawing the data borders on bars 312 | and stackedbars plots. This supports having the same style (borders with 313 | matching color, or no borders) on both the legend color boxes and the data 314 | bars. The default is backward compatible: borders on unshaded plots, and 315 | no borders on shaded plots. 316 | 317 | Feature request #51 "Lines instead of colorboxes in legend": 318 | Implemented with existing function SetLegendUseShapes(). PHPlot now has 319 | the option of showing short line segments (with correct color and width) in 320 | the legend, rather than color boxes. This applies to lines and squared 321 | plots only. 322 | 323 | ----------------------------------------------------------------------------- 324 | 325 | 2012-04-06 Release 5.8.0 326 | 327 | === Overview: 328 | 329 | This is the current stable release of PHPlot. This release adds several new 330 | features, including the ability to generate "streaming plots" - a video 331 | stream showing updated plot data. 332 | 333 | The PHPlot Reference Manual has been updated to match this release. 334 | 335 | 336 | === Cautions, Important Notes, and Compatibility Issues: 337 | 338 | There are no known compatibility issues in upgrading from PHPlot-5.7.0 to 339 | this release. For issues with previous releases, see below in this file. 340 | 341 | 342 | === Bugs Fixed in 5.8.0: 343 | 344 | Fix bug #3506408 "Data Label Lines vs new plot types": 345 | Data label lines do work with bubble plots. This is now documented. Data 346 | label lines did not work well with OHLC plot types. This was never documented 347 | to work, and is now disabled. 348 | 349 | 350 | === New features in 5.8.0: 351 | 352 | Feature request #3488042 "Display only some data value labels": 353 | Custom label formatting functions now have access to the data point row and 354 | column for data value labels, and to the row for axis data labels. You can 355 | now filter or modify labels based on their position in the data array. 356 | Documentation was updated. 357 | 358 | Feature request #3501500 "Looping plot section (updating plot data)": 359 | PHPlot can now produce "streaming plots", with updating data presented as a 360 | Motion-JPEG stream. Documentation has been added to the reference manual. 361 | 362 | Feature request #3515519 "Support object serialize/unserialize": 363 | You can now serialize and unserialize a PHPlot object, subject to some 364 | minor restrictions. Details are in the PHPlot Reference Manual. 365 | 366 | ----------------------------------------------------------------------------- 367 | 368 | 2012-02-25 Release 5.7.0 369 | 370 | === Overview: 371 | 372 | This is the current stable release of PHPlot. This release includes several 373 | bug fixes, new color controls for labels, a new feature for application-level 374 | error handling, and an experimental feature for creating plot image maps. 375 | 376 | The PHPlot reference manual has been updated to match this release. 377 | 378 | 379 | === Cautions, Important Notes, and Compatibility Issues: 380 | 381 | This release includes a change in how the color is set for data value 382 | labels. (These are the labels inside the plot area that identify the tops 383 | of bars, for example.) This can change the color of some labels. See the 384 | bug report "Wrong color for data value labels" below. 385 | 386 | This release reverts a change from PHPlot-5.4.0 to stackedbars plots. It 387 | affects plots with stacked bar segments of size 0 that are at the top or 388 | end of a stack. Starting in PHPlot-5.4.0, a zero-size segment at the top or 389 | end would result in a color 'cap' on the bar stack, using the data color of 390 | the zero-size segment. In PHPlot-5.7.0 this has been fixed. This will 391 | change the appearance of some stackedbars plots. See the bug report "Top 392 | dropshadow [sic] of stacked bars..." 393 | 394 | 395 | === Bugs Fixed in 5.7.0: 396 | 397 | 398 | #3396931 "Top dropshadow of stacked bars is always the same color": 399 | PHPlot will no longer draw a color 'cap' at the top or end of a bar stack 400 | if the last segment has a 0 value. (The term 'dropshadow' isn't correct.) 401 | Drawing the color for zero-size segments started in PHPlot-5.4.0 as part of 402 | the fix for bug #3296884, but the behavior was unexpected, so it was reverted. 403 | In general, PHPlot will now ignore segments with size 0, and if a stack 404 | contains all 0 values it will not be drawn. (The exception is if the axis is 405 | moved.) 406 | 407 | #3488064 "Pie label failures in locales with comma decimal": 408 | Two work-arounds are implemented for what is essentially a PHP problem with 409 | locales that use something other than a period (typically comma) for the 410 | decimal separator. When formatting labels as type 'data', PHPlot loads the 411 | locale settings to get the separator characters, but now it resets ('unloads') 412 | the settings afterwards. This helps avoid an error seen in PHPlot-5.6.0 with 413 | pie chart labels, where an incidental conversion of the label to a string 414 | resulted in use of the comma separator, followed by PHP failing to convert 415 | the number back to floating point because of the comma. The second 416 | work-around is to avoid the conversion to string, in the case where the pie 417 | label has a single value. Together, these work-arounds should prevent the 418 | problem, but this is an imperfect fix. 419 | 420 | #3486834 "Wrong color for data value labels": 421 | PHPlot was using the 'title' color (SetTitleColor()) for data value labels, 422 | which was wrong, as the title color is for the 3 plot title strings. PHPlot 423 | will now use the general text color (SetTextColor()) for data value labels, 424 | same as tick labels and axis data labels. This will change the appearance 425 | of some plots. In order to help with the compatibility issue, 4 new 426 | functions are introduced to control the colors of individual label types: 427 | SetTickLabelColor(), SetPieLabelColor(), SetDataLabelColor(), and 428 | SetDataValueLabelColor(). The defaults have been set up to be compatible 429 | (except for data value labels). Details are in the PHPlot Reference Manual. 430 | 431 | === New features in 5.7.0: 432 | 433 | #3442041 "Provide data for generating image maps": 434 | An experimental feature has been added to allow a callback function to 435 | process the coordinates of individual plotted data points. This is most 436 | useful for generating an HTML image map for the plot. Refer to the text 437 | file Imagemaps.txt included in the PHPlot release for details. Caution: 438 | This is an experimental feature. It is subject to change, and not yet 439 | documented in the reference manual. 440 | 441 | #3481195 "Custom message image": 442 | A new function DrawMessage() has been implement for special cases where you 443 | need to display an image containing a message, rather than a plot. This 444 | extends the PHPlot error reporting mechanism, and is intended for 445 | application-level errors. More information and an example can be found 446 | in the PHPlot Reference Manual. 447 | 448 | 449 | ----------------------------------------------------------------------------- 450 | 451 | 2012-01-02 Release 5.6.0 452 | 453 | === Overview: 454 | 455 | This is the current stable release of PHPlot. This release includes 456 | significant changes to pie charts. There are new ways to label pie charts, 457 | and PHPlot does a better job calculating the size and positioning the labels. 458 | 459 | The PHPlot reference manual has been updated to match this release. 460 | 461 | 462 | === Cautions, Important Notes, and Compatibility Issues: 463 | 464 | Pie charts will change appearance when you upgrade to PHPlot-5.6.0 from any 465 | previous release. This is due to changes resulting from bug #3403297, 466 | described below. You may notice these changes: 467 | 468 | 1. The pie chart itself will usually be drawn larger, taking up more of 469 | the image. This may result in interference with a plot legend. 470 | 471 | 2. Pie chart labels will be closer to the edge of the pie, if you are letting 472 | the label positions default. If you are using SetLabelScalePosition() to 473 | set the label positions, the results may vary even more. 474 | 475 | 3. Text alignment on pie chart labels will change. 476 | 477 | 4. World Coordinates are now undefined with pie charts. 478 | 479 | If you are producing pie charts with PHPlot, you should review the output 480 | of your scripts before using PHPlot-5.6.0 in production. If the output is 481 | not acceptable, one or more of these steps might help: 482 | 483 | 1. If pie charts are too large, and/or interfere with a legend, try moving the 484 | legend. Alternatively, use SetPlotAreaPixels() or SetMarginsPixels() to 485 | limit the plot area. Note, however, that starting in this release PHPlot 486 | sizes the pie so the labels fit inside the plot area too. You can control 487 | this with SetPieAutoSize(). 488 | 489 | 2. If you want labels positioned just outside the pie chart, do not call 490 | SetLabelScalePosition(), or set the value to the default 0.5. If you want 491 | labels just inside the pie, use 0.49. If you want labels to be about 492 | half-way inside the pie, use 0.25. (In previous releases, PHPlot multiple 493 | the label scale position by 1.2 before using it to position the labels, 494 | but this was not documented.) 495 | 496 | 3. Your pie chart script will report errors if you use GetDeviceXY(), 497 | SetLegendWorld(), or SetLegendPosition(...,..., 'world'). This is because 498 | these functions require world coordinates, and world coordinates are not 499 | defined for pie charts. (Previous releases did define a world coordinate 500 | space for pie charts, but the values were meaningless.) 501 | 502 | 503 | 504 | === Bugs Fixed in 5.6.0: 505 | 506 | #3403297 Pie chart sizing and label issues: 507 | In addition to the fixes listed here, new features were added as a result 508 | of this bug fix (see New features below). 509 | 510 | + Use both width and height of the pie when calculating its maximum size. 511 | (The bug was that the pie diameter would be sized to fit in the smaller 512 | of the image width and height. But a shaded pie is oval, so when the width 513 | if the pie was sized to the height of the image, the pie was too small.) 514 | 515 | + Fixed the text alignment of pie labels so they extend more naturally 516 | away from the pie chart (if outside the pie). (Don't just use center/center 517 | alignment for all labels.) 518 | 519 | + Do not multiply the label scale position by 1.2 in the hope that this will 520 | prevent labels from overlapping the pie. Use the label scale position 521 | as intended, and take other measures to prevent label overlap (such as 522 | fixing the text alignment). 523 | 524 | + Label positions along the bottom of the pie are now adjusted to account for 525 | the pie shading depth. 526 | 527 | + Plot area borders now work with pie charts. Use SetPlotBorderType() to 528 | enable them. The default is not to draw borders. 529 | 530 | === New features in 5.6.0: 531 | 532 | A number of new features were added as a result of bug #3403297, described 533 | above. The new features are: 534 | + Use the new function SetPieLabelType() to select the type of pie labels 535 | to be displayed. Labels can show segment percentages, segment values, 536 | string labels, or any other value using a custom function. 537 | 538 | + SetPieLabelType() also allows control over formatting of pie labels, 539 | similar to the way X and Y tick and data labels can be formatted. 540 | 541 | + Plot labels can be suppressed with SetLabelScalePosition(0). 542 | 543 | + The aspect ratio of shaded pies can be controlled with a tuning variable 544 | $pie_diam_factor. The default remains 0.5, making the pie height equal to 545 | half its width. 546 | 547 | 548 | 549 | #413925 Table of values: 550 | This very old feature request was implemented by adding a new script to the 551 | "contrib" directory. The data_table.php script contains a function to draw 552 | a simple table of values on a PHPlot image. Examples are provided. 553 | 554 | 555 | ----------------------------------------------------------------------------- 556 | For older releases, see NEWS_part1.txt 557 | -------------------------------------------------------------------------------- /phplot/NEWS_part1.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davefx/PHPlot/8399b7b18ebc542ad4cc2796c348b03ba029be53/phplot/NEWS_part1.txt -------------------------------------------------------------------------------- /phplot/README.txt: -------------------------------------------------------------------------------- 1 | This is the README file for PHPlot 2 | Last updated for PHPlot-6.2.0 on 2015-11-03 3 | The project web site is http://sourceforge.net/projects/phplot/ 4 | The project home page is http://phplot.sourceforge.net/ 5 | ----------------------------------------------------------------------------- 6 | 7 | OVERVIEW: 8 | 9 | PHPlot is a PHP class for creating scientific and business charts. 10 | 11 | The release documentation contains only summary information. For more 12 | complete information, download the PHPlot Reference Manual from the 13 | Sourceforge project web site. You can also view the manual online at 14 | http://phplot.sourceforge.net 15 | 16 | For information about changes in this release, including any possible 17 | incompatibilities, see the NEWS.txt file. 18 | 19 | 20 | CONTENTS: 21 | 22 | COPYING . . . . . . . . . . . . LGPL 2.1 License file 23 | ChangeLog . . . . . . . . . . . Lists changes to the sources 24 | NEWS.txt . . . . . . . . . . . . Highlights changes in releases 25 | NEWS_*.txt . . . . . . . . . . . Older NEWS files 26 | README.txt . . . . . . . . . . This file 27 | contrib . . . . . . . . . . . . "Contributed" directory, add-ons 28 | phplot.php . . . . . . . . . . The main PHPlot source file 29 | rgb.inc.php . . . . . . . . . . Optional extended color table 30 | 31 | 32 | REQUIREMENTS: 33 | 34 | You need a recent version of PHP, and you are advised to use the latest 35 | stable release. This version of PHPlot was tested with PHP-5.6.15, 36 | PHP-5.5.30, PHP-5.4.45, and also with the pre-release PHP-7.0.0RC6. 37 | (Windows testing was limited to PHP-5.4.x.) 38 | 39 | Note: At the time of this release, PHP-5.4.x just entered end-of-life with 40 | no expected further support from the PHP Group. This version of PHPlot 41 | still works with PHP-5.4.x, but future versions will probably not be 42 | tested with or support PHP-5.4.x. 43 | 44 | At the time of this release, PHP-7 has not yet been released. This 45 | version of PHPlot has been tested with a pre-release version of PHP-7, 46 | and contains fixes that are required for PHP-7. 47 | 48 | You need the GD extension to PHP either built in to PHP or loaded as a 49 | module. Refer to the PHP documentation for more information - see the 50 | Image Functions chapter in the PHP Manual. We test PHPlot mostly with the 51 | PHP-supported, bundled GD library. 52 | 53 | If you want to display PHPlot charts on a web site, you need a PHP-enabled 54 | web server. You can also use the PHP CLI interface without a web server. 55 | 56 | PHPlot supports TrueType fonts, but does not include any TrueType font files. 57 | If you want to use TrueType fonts on your plots, you need to have TrueType 58 | support in GD, and some TrueType font files. (Your operating system most 59 | likely includes TrueType fonts.) By default, PHPlot uses a simple font which 60 | is built in to the GD library. 61 | 62 | 63 | INSTALLATION: 64 | 65 | Unpack the distribution. (If you are reading this file, you have probably 66 | already done that.) 67 | 68 | Installation of PHPlot simply involves copying two script files somewhere 69 | your PHP application scripts will be able to find them. The scripts are: 70 | phplot.php - The main script file 71 | rgb.inc.php - Optional large color table 72 | Make sure the permissions on these files allow the web server to read them. 73 | 74 | The ideal place is a directory outside your web server document area, 75 | and on your PHP include path. You can add to the include path in the PHP 76 | configuration file; consult the PHP manual for details. 77 | 78 | 79 | UPGRADING: 80 | 81 | To upgrade PHPlot, follow the same instructions as for installing. There 82 | may be changes between releases which can alter the appearance of your plots. 83 | Please check the top section in NEWS.txt for details. 84 | 85 | 86 | KNOWN ISSUES: 87 | 88 | Here are some of the problems we know about in PHPlot. See the bug tracker 89 | on the PHPlot project web site for more information. 90 | 91 | #173 Area fill plots with data borders and overlapping areas 92 | New in release 6.2.0 are data borders for area and squaredarea plot types. 93 | With multiple data sets, if the areas overlap, the borders are drawn without 94 | regard to the overlap, and don't correspond to the visible areas. 95 | 96 | #171 Dashed patters aren't continuing 97 | PHPlot line styles are not being drawn properly when the dashed pattern 98 | is long relative to the data point spacing. 99 | 100 | #146 (was: 3142124) Clip plot elements to plot area 101 | Plot elements are not currently clipped to the plot area, and may extend 102 | beyond. PHP does not currently support the GD clipping control. 103 | 104 | #93 (was: 1605558) Wide/Custom dashed lines don't work well 105 | There is a question whether this is a PHP/GD issue, or behaving as 106 | expected. 107 | 108 | 109 | PHP Issues: 110 | 111 | PHP has many build-time and configuration options, and these can affect 112 | the operation of PHPlot (as well as any other application or library). Here 113 | are some known issues: 114 | 115 | + If PHP is built with Thread Safety on (ZTS), the GD extension is 116 | unable to find TrueType fonts unless the full path is given. (This might 117 | be a PHP bug.) The text in the PHPlot Reference Manual section 118 | "TrueType Font Selection" concerning finding fonts without a path does not 119 | work on these systems. This has been found to affect the version of PHP 120 | distributed with Slackware, but not Ubuntu. It affects the thread-safe PHP 121 | Windows release, but not the non-thread-safe (NTS) Windows release. 122 | 123 | + Slackware Linux used to include a PHP built with --enable-gd-jis-conv 124 | (JIS-mapped Japanese font support). This prevented the usual UTF-8 encoding 125 | of characters from working in TrueType Font (TTF) text strings. This does 126 | not affect recent Slackware, though (14.0 and up). 127 | 128 | + The Ubuntu Linux PHP GD package (php5-gd) was built to use the external 129 | shared GD library, not the one bundled with PHP. This can result in small 130 | differences in images, and some unsupported features (such as advanced 131 | truecolor image operations). Also, although this Ubuntu GD library was 132 | built with fontconfig support, PHP does not use it, so you still need to 133 | specify TrueType fonts with their actual file names. These also affect 134 | Ubuntu-derived distributions such as Linux Mint. 135 | 136 | + Some PHP installations may have a memory limit set too low to support 137 | large images, especially truecolor images. 138 | 139 | + The default TrueType font can be changed by external factors. If you 140 | enable TrueType fonts, but don't select a font name, PHPlot can find a 141 | default TrueType font on many systems, including Windows. However, the 142 | selected font can change if you install or remove software. For example, on 143 | Windows, PHPlot may select the Arial font. But then, if you install 144 | LibreOffice, the default font will change to Liberation Sans. This will 145 | change plot appearance. This happens because LibreOffice installs the 146 | Liberation font family in the Windows fonts directory, and the Liberation 147 | Sans font precedes Arial in PHPlot's list of candidate default fonts. 148 | 149 | 150 | 151 | If you think you found a problem with PHPlot, or want to ask questions or 152 | provide feedback, please use the Help and Discussion forum at 153 | http://sourceforge.net/projects/phplot/ 154 | If you are sure you have found a bug, you can report it on the Bug tracker 155 | at the same web site. There is also a Features Request tracker. 156 | 157 | 158 | TESTING: 159 | 160 | You can test your installation by creating the following two files somewhere 161 | in your web document area. First, the HTML file: 162 | 163 | ------------ simpleplot.html ---------------------------- 164 | 165 | 166 | Hello, PHPlot! 167 | 168 | 169 |

PHPlot Test

170 | 171 | 172 | 173 | --------------------------------------------------------- 174 | 175 | Second, in the same directory, the image file producing PHP script file. 176 | Depending on where you installed phplot.php, you may need to specify a path 177 | in the 'require' line below. 178 | 179 | ------------ simpleplot.php ----------------------------- 180 | SetDataValues($data); 185 | $plot->SetDataType('data-data'); 186 | $plot->DrawGraph(); 187 | --------------------------------------------------------- 188 | 189 | Access the URL to 'simpleplot.html' in your web browser. If you see a 190 | simple graph, you have successfully installed PHPlot. If you see no 191 | graph, check your web server error log for more information. 192 | 193 | 194 | COPYRIGHT and LICENSE: 195 | 196 | PHPlot is Copyright (C) 1998-2015 Afan Ottenheimer 197 | 198 | This is free software; you can redistribute it and/or 199 | modify it under the terms of the GNU Lesser General Public 200 | License as published by the Free Software Foundation; 201 | version 2.1 of the License. 202 | 203 | This software is distributed in the hope that it will be useful, 204 | but WITHOUT ANY WARRANTY; without even the implied warranty of 205 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 206 | Lesser General Public License for more details. 207 | 208 | You should have received a copy of the GNU Lesser General Public 209 | License along with this software; if not, write to the Free Software 210 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 211 | 212 | Notice: Despite the presence of the letters "PHP" in the name of 213 | PHPlot, it should be apparent that this software is not a product 214 | of the PHP Group, is not derived from PHP, and the PHP Group does 215 | endorse and is not responsible for this product. 216 | 217 | -------------------------------------------------------------------------------- /phplot/contrib/README.txt: -------------------------------------------------------------------------------- 1 | This is the README for PHPlot Contributed Code 2 | The project web site is http://sourceforge.net/projects/phplot/ 3 | Last updated on 2011-08-05 4 | ----------------------------------------------------------------------------- 5 | 6 | The PHPlot Contributed Code directory contains code you might find useful 7 | with PHPlot, but that doesn't quite belong as part of PHPlot itself. 8 | 9 | You will have to read the comments in the code files, and see the example 10 | files, to determine what these do and if they are useful to you. None of 11 | these functions is documented in the PHPlot Reference Manual. 12 | 13 | You may include or paste these functions into your own scripts. Check the 14 | files for details, but some of these are considered "public domain" with no 15 | usage or license restrictions. 16 | 17 | ----------------------------------------------------------------------------- 18 | Contents: 19 | 20 | prune_labels: Reduce the number of labels along the X axis 21 | prune_labels.php . . . . . . . . . . . . Code 22 | prune_labels.example.php . . . . . . . . Example 23 | prune_labels.test.php . . . . . . . . . Test 24 | 25 | color_range: Create a gradient color map for data colors 26 | color_range.php . . . . . . . . . . . . Code 27 | color_range.example.php . . . . . . . . Example 28 | color_range.test1.php . . . . . . . . . Image creation test 29 | color_range.test2.php . . . . . . . . . Unit test 30 | 31 | data_table: Draw a table of data values on the plot 32 | data_table.php . . . . . . . . . . . . . Code 33 | data_table.example1.php . . . . . . . . Example: Stand-alone tables 34 | data_table.example2.php . . . . . . . . Example: Line plot with table 35 | data_table.example3.php . . . . . . . . Example: Pie chart with table 36 | 37 | ----------------------------------------------------------------------------- 38 | -------------------------------------------------------------------------------- /phplot/contrib/color_range.example.php: -------------------------------------------------------------------------------- 1 | SetTitle('Example - Bar Chart with gradient colors'); 22 | $p->SetDataType('text-data'); 23 | $p->SetDataValues($data); 24 | $p->SetPlotAreaWorld(0, 0, $x_values, 100); 25 | 26 | # This isn't necessary, as we do know how many data sets (bars_per_group): 27 | $n_data = count_data_sets($data, 'text-data'); 28 | # Make a gradient color map: 29 | $colors = color_range($p->SetRGBColor('SkyBlue'), 30 | $p->SetRGBColor('DarkGreen'), $n_data); 31 | $p->SetDataColors($colors); 32 | $p->SetXTickLabelPos('none'); 33 | $p->SetXTickPos('none'); 34 | $p->SetPlotType('bars'); 35 | $p->DrawGraph(); 36 | -------------------------------------------------------------------------------- /phplot/contrib/color_range.php: -------------------------------------------------------------------------------- 1 | 8 | "I wrote this code to calculate the range of colors between 2 colors 9 | to plot using the range from color_a to color_b..." 10 | 11 | I have changed the code and repackaged it, but the idea is the same. 12 | Given 2 colors and number of data sets, computes an array of colors 13 | that make up a gradient between the two provided colors, for use 14 | with SetDataColors(). 15 | 16 | Provides the following functions: 17 | $colors = color_range($color_a, $color_b, $n_intervals) 18 | Returns a color array for SetDataColors. 19 | 20 | $n = count_data_sets($data, $data_type) 21 | Counts the number of data sets in a data array. 22 | This can be used to provide $n_intervals in color_range(). 23 | */ 24 | 25 | 26 | 27 | /* 28 | Fill a color map with a gradient step between two colors. 29 | Arguments: 30 | $color_a : Starting color for the gradient. Array of (r, g, b) 31 | $color_b : Ending color for the gradient. Array of (r, g, b) 32 | $n_steps : Total number of color steps, including color_a and color_b. 33 | 34 | Returns: A color map array with n_steps colors in the form 35 | $colors[i][3], suitable for SetDataColors(). 36 | 37 | Notes: 38 | You may use the PHPlot internal function $plot->SetRGBColor($color) 39 | to convert a color name or #rrggbb notation into the required array 40 | of 3 values (r, g, b) for color_a and color_b. 41 | 42 | Newer versions of PHPlot use 4 components (r, g, b, a) arrays for color. 43 | This script ignores the alpha component in those arrays. 44 | 45 | */ 46 | function color_range($color_a, $color_b, $n_steps) 47 | { 48 | if ($n_steps < 2) $n_steps = 2; 49 | $nc = $n_steps - 1; 50 | # Note: $delta[] and $current[] are kept as floats. $colors is integers. 51 | for ($i = 0; $i < 3; $i++) 52 | $delta[$i] = ($color_b[$i] - $color_a[$i]) / $nc; 53 | $current = $color_a; 54 | for ($col = 0; $col < $nc; $col++) { 55 | for ($i = 0; $i < 3; $i++) { 56 | $colors[$col][$i] = (int)$current[$i]; 57 | $current[$i] += $delta[$i]; 58 | } 59 | } 60 | $colors[$nc] = $color_b; # Make sure the last color is exact. 61 | return $colors; 62 | } 63 | 64 | 65 | /* 66 | Determine the number of data sets (plot lines, bars per group, pie 67 | segments, etc.) contained in a data array. 68 | This can be used to determine n_steps for $color_range. 69 | 70 | Arguments: 71 | $data : PHPlot data array 72 | $data_type : PHPlot data type, describing $data. (e.g. 'data-data') 73 | Returns: The number of data sets in the data array. 74 | Notes: 75 | This has to scan the entire data array. Don't use this unless you 76 | really don't have a better way to determine the number of data sets. 77 | 78 | This does NOT require that the data array be integer indexed. 79 | 80 | */ 81 | function count_data_sets($data, $data_type) 82 | { 83 | 84 | if ($data_type == 'text-data-single') 85 | return count($data); # Pie chart, 1 segment per record 86 | 87 | # Get the longest data record: 88 | $max_row = 0; 89 | foreach ($data as $row) 90 | if (($n = count($row)) > $max_row) $max_row = $n; 91 | 92 | if ($data_type == 'text-data' || $data_type == 'text-data-yx') 93 | return ($max_row - 1); # Each record is (label Y1 Y2...) 94 | 95 | if ($data_type == 'data-data' || $data_type == 'data-data-yx') 96 | return ($max_row - 2); # Each record is (label X Y1 Y2...) 97 | 98 | if ($data_type == 'data-data-error') 99 | return (($max_row - 2) / 3); # Each record is (label X Y1 Y1+ Y1-...) 100 | 101 | # Not a recognized data type... Just return something sane. 102 | return $max_row; 103 | } 104 | -------------------------------------------------------------------------------- /phplot/contrib/color_range.test1.php: -------------------------------------------------------------------------------- 1 | array("Label", 'Y1', 'Y2', 'Y3'), 32 | 'column_widths' => array(3, 1, 2, 3), 33 | 'column_formats' => array('%s', '%d', '%5.2f', '%6g'), 34 | 'width' => $tbl_width, 35 | 'height' => $tbl_height, 36 | 'data' => $data, 37 | 'column_alignments' => array('C', 'R', 'R', 'R'), 38 | ); 39 | 40 | $img = imagecreate($img_width, $img_height); 41 | $white = imagecolorresolve($img, 255, 255, 255); 42 | $red = imagecolorresolve($img, 255, 0, 0); 43 | imageline($img, 0, $cy, $img_width-1, $cy, $red); 44 | imageline($img, $cx, 0, $cx, $img_height-1, $red); 45 | 46 | draw_data_table($img, array_merge($base_settings, array( 47 | 'position' => array(10, 10), 48 | ))); 49 | draw_data_table($img, array_merge($base_settings, array( 50 | 'position' => array($cx + 10, 10), 51 | 'cellpadding' => 12, 52 | 'column_alignments' => array('R', 'L', 'R', 'R'), 53 | ))); 54 | draw_data_table($img, array_merge($base_settings, array( 55 | 'position' => array(10, $cy + 10), 56 | 'color' => array(0x66, 0x66, 0xcc), 57 | ))); 58 | draw_data_table($img, array_merge($base_settings, array( 59 | 'position' => array($cx + 10, $cy + 10), 60 | 'font' => 4, 61 | ))); 62 | 63 | imagepng($img); 64 | -------------------------------------------------------------------------------- /phplot/contrib/data_table.example2.php: -------------------------------------------------------------------------------- 1 | array(NULL, 'X', '2Y', 'Y^2'), 14 | 'position' => array(640, 20), 15 | 'width' => 150, 16 | 'data' => $data, 17 | 'font' => 3, 18 | ); 19 | 20 | $plot = new PHPlot(800, 600); 21 | $plot->SetTitle('Line Plot with Data Table on Right Side'); 22 | $plot->SetDataValues($data); 23 | $plot->SetDataType('data-data'); 24 | $plot->SetPlotType('linepoints'); 25 | $plot->SetPlotAreaPixels(NULL, NULL, 630, NULL); 26 | $plot->SetCallback('draw_graph', 'draw_data_table', $settings); 27 | $plot->SetLegend(array('2Y', 'Y^2')); 28 | $plot->DrawGraph(); 29 | -------------------------------------------------------------------------------- /phplot/contrib/data_table.example3.php: -------------------------------------------------------------------------------- 1 | array('Metal', 'Amount'), 20 | 'data' => $data, 21 | ); 22 | 23 | $plot = new PHPlot(600, 400); 24 | $plot->SetTitle('Pie Chart with Legend and Data Table'); 25 | $plot->SetDataValues($data); 26 | $plot->SetDataType('text-data-single'); 27 | $plot->SetPlotType('pie'); 28 | foreach ($data as $row) $plot->SetLegend($row[0]); 29 | $plot->SetCallback('draw_graph', 'draw_data_table', $settings); 30 | $plot->DrawGraph(); 31 | -------------------------------------------------------------------------------- /phplot/contrib/data_table.php: -------------------------------------------------------------------------------- 1 | A PHPlot-style data array. Array[0..n-1] of rows, each 40 | row entry is an array with values (strings or numbers). The 41 | 'headers' entry (see below) determines which columns are used in 42 | the table. Other settings control how the values are formatted and 43 | drawn in the table. 44 | Note: Multi-line string values (with newlines) do not work. 45 | 46 | 'headers' => Array of headers for the data array. 47 | There must be an entry for each data array column. The entry is the 48 | header label for that column. NULL means do not include this data array 49 | column in the table. 50 | Header labels are centered within the header row of the table. 51 | Multi-line entries (with newlines) are not supported and do not work. 52 | 53 | The following keys are optional in the settings array: 54 | 55 | 'position' => Array (x, y) giving the GD coordinates for the upper left 56 | corner of the table. The default is (0,0), which is the upper left 57 | corner of the image. 58 | 59 | 'height' => Height in pixels of the table. 60 | If not given or empty or 0, the table height is calculated as the minimum 61 | value, taking into account the number of rows, font height, and 62 | cellpadding value. 63 | 64 | 'width' => Width in pixels of the table 65 | If not given or empty or 0, the table width is calculated to just fit 66 | the widest value in each column (after formatting). 67 | If width is not provided, column_widths is ignored. 68 | 69 | 'column_widths' => Array of relative column width weights. 70 | For example: array(4,2,1,1) means the 1st column is 2 times 71 | as wide as the 2nd, and 4 times as wide as the 3rd and 4th. 72 | If missing, all columns get equal width. Ignored if the overall 73 | table width is not given. 74 | 75 | 'column_formats' => Array of printf formats for each column. 76 | An empty string means no formatting for that column - the value is 77 | drawn into the table using PHP's defaults. 78 | If missing, there is no formatting for any column. 79 | 80 | 'column_alignments' => Array of L C or R for horizontal alignment, meaning 81 | left align, center, or right align. 82 | An empty string means automatic: align right if numeric, else left. 83 | Default if missing is automatic for all columns. 84 | 85 | 'font' => GD font number 1-5. 1 is smallest, 5 is largest. Default is 2. 86 | 87 | 'color' => Array with R, G, B color specification. Default is (0,0,0)=black. 88 | White would be (255,255,255). This color is used for grid lines 89 | and text in the table. 90 | 91 | 'cellpadding' => Line to text gap in pixels. Default is 4. 92 | 93 | Note that the arrays 'column_widths', 'column_formats', and 'column_alignments' 94 | have one entry for each column in the table which will be drawn. This is 95 | different from 'headers', which has one column for each column in the 96 | data array. These sizes will be the same only if 'headers' has no NULL 97 | entries - that is, no data array columns are being skipped. 98 | 99 | */ 100 | function draw_data_table($img, $settings) 101 | { 102 | // Apply defaults, then extract all settings as variables named 'o_*': 103 | extract(array_merge(array( 104 | 'color' => array(0, 0, 0), // Default black 105 | 'font' => 2, // Default GD font 106 | 'position' => array(0, 0), // Default to upper left corner 107 | 'width' => 0, // Default auto width calculation 108 | 'height' => 0, // Default auto height calculation 109 | 'cellpadding' => 4, // Default line-to-text spacing 110 | ), $settings), EXTR_PREFIX_ALL, 'o'); 111 | list($x, $y) = $o_position; // Expand to separate variables 112 | 113 | // Check for mandatory settings: 114 | if (!isset($o_data, $o_headers)) { 115 | trigger_error("draw_data_table error: 'headers' and 'data' are required"); 116 | return FALSE; // In case error handler returns 117 | } 118 | 119 | // Font and color setup: 120 | $char_width = imagefontwidth($o_font); 121 | $char_height = imagefontheight($o_font); 122 | $color = imagecolorresolve($img, $o_color[0], $o_color[1], $o_color[2]); 123 | $pad2 = 2 * $o_cellpadding; // Pad all 4 sides of cells 124 | 125 | // Calculate the number of rows and columns in the table: 126 | $n_rows = count($o_data) + 1; // Add 1 for header row 127 | // Count non-skipped columns: 128 | $n_cols = 0; 129 | foreach ($o_headers as $h) if (!is_null($h)) $n_cols++; 130 | // Number of columns in the data array and in $o_headers: 131 | $n_data_cols = count($o_headers); 132 | 133 | // Default column weights so all columns have equal width. 134 | if (empty($o_column_widths)) 135 | $o_column_widths = array_fill(0, $n_cols, 1); 136 | 137 | // Default column formats to no formatting: 138 | if (empty($o_column_formats)) 139 | $o_column_formats = array_fill(0, $n_cols, ''); 140 | 141 | // Default column alignments to auto align: 142 | if (empty($o_column_alignments)) 143 | $o_column_alignments = array_fill(0, $n_cols, ''); 144 | 145 | // Make sure there are the right number of entries. 146 | if (count($o_column_widths) != $n_cols 147 | || count($o_column_formats) != $n_cols 148 | || count($o_column_alignments) != $n_cols) { 149 | trigger_error("draw_data_table error: Mismatch in size of column spec arrays"); 150 | return FALSE; // In case error handler returns 151 | } 152 | 153 | // If the table height is not supplied, calculate the space needed. 154 | if (empty($o_height)) 155 | $o_height = $n_rows * ($char_height + $pad2); 156 | // Then calculate the height of each row. 157 | $row_height = $o_height / $n_rows; 158 | 159 | // If the table width is not supplied, calculate the space needed based 160 | // on the widest value for each column (including header). The column width 161 | // factors are ignored, since each column will be as wide as needed. 162 | if (empty($o_width)) { 163 | $o_width = 0; 164 | $col = 0; // Index to unskipped columns 165 | for ($i = 0; $i < $n_data_cols; $i++) { // Index to all columns 166 | if (is_null($o_headers[$i])) continue; // Skip column 167 | // Find the longest string in this column, post-formatting. 168 | $len = strlen($o_headers[$i]); // Start with the header 169 | for ($row = 1; $row < $n_rows; $row++) { 170 | if (($cell = $o_data[$row - 1][$i]) !== '') { // Non-empty 171 | // Apply cell format if specified: 172 | if (($fmt = $o_column_formats[$col]) != '') 173 | $cell = sprintf($fmt, $cell); 174 | if (($this_len = strlen($cell)) > $len) 175 | $len = $this_len; 176 | } 177 | } 178 | // Assign column width, and accumulate the total: 179 | $o_width += $col_width[$col++] = $len * $char_width + $pad2; 180 | } 181 | } else { // Table width, and optionally column width factors, are supplied. 182 | // Calculate the width of each column. 183 | $col_width_scale = $o_width / array_sum($o_column_widths); 184 | for ($col = 0; $col < $n_cols; $col++) 185 | $col_width[$col] = $o_column_widths[$col] * $col_width_scale; 186 | } 187 | 188 | // Calculate the column start positions within the table: 189 | $col_start[0] = 0; 190 | for ($i = 1; $i < $n_cols; $i++) 191 | $col_start[$i] = $col_start[$i-1] + $col_width[$i-1]; 192 | 193 | // Draw the table grid (without outer border) 194 | $x2 = $x + $o_width - 1; 195 | for ($row = 1; $row < $n_rows; $row++) { 196 | $y0 = $y + $row_height * $row; // Avoid accumulating errors. 197 | imageline($img, $x, $y0, $x2, $y0, $color); 198 | } 199 | $y2 = $y + $o_height - 1; 200 | for ($col = 1; $col < $n_cols; $col++) { 201 | $x0 = $x + $col_start[$col]; 202 | imageline($img, $x0, $y, $x0, $y2, $color); 203 | } 204 | 205 | // Draw the header row, then the data rows 206 | for ($row = 0; $row < $n_rows; $row++) { 207 | 208 | // Vertically center the cell contents within the cell: 209 | $y0 = $y + $row_height * ($row + 0.5) - $char_height / 2; 210 | 211 | if ($row == 0) $cells = $o_headers; // Header row 212 | else $cells = $o_data[$row - 1]; // -1 accounts for header row. 213 | 214 | $col = 0; // Index to unskipped columns 215 | for ($i = 0; $i < $n_data_cols; $i++) { // Index to all columns 216 | 217 | if (is_null($o_headers[$i])) continue; // NULL header => skip column 218 | 219 | if (($cell = $cells[$i]) !== '') { // Empty cell? 220 | if ($row == 0) { 221 | $alg = 'C'; // Header row forces center alignment 222 | } else { 223 | // Apply cell format if specified: 224 | if (($fmt = $o_column_formats[$col]) != '') 225 | $cell = sprintf($fmt, $cell); 226 | // Get cell alignment: 227 | $alg = $o_column_alignments[$col]; 228 | } 229 | 230 | // Calculate upper left position for this cell's text: 231 | if (empty($alg)) // Default alignment: numbers right, else left. 232 | $alg = is_numeric($cell) ? 'R' : 'L'; 233 | $x0 = $x + $col_start[$col]; 234 | if ($alg == 'R') { 235 | $x0 += $col_width[$col] - strlen($cell) * $char_width - $o_cellpadding; 236 | } elseif ($alg == 'C') { 237 | $x0 += ($col_width[$col] - strlen($cell) * $char_width) / 2; 238 | } else { // Default, assume L 239 | $x0 += $o_cellpadding; 240 | } 241 | imagestring($img, $o_font, $x0, $y0, $cell, $color); 242 | } 243 | $col++; 244 | } 245 | } 246 | return TRUE; 247 | } 248 | -------------------------------------------------------------------------------- /phplot/contrib/prune_labels.example.php: -------------------------------------------------------------------------------- 1 | SetTitle('Example - pruned data labels'); 21 | $p->SetDataType('data-data'); 22 | $p->SetDataValues($data); 23 | $p->SetXLabelType('time', '%Y-%m-%d'); 24 | $p->SetXLabelAngle(90); 25 | $p->SetXDataLabelPos('plotdown'); 26 | $p->SetXTickLabelPos('none'); 27 | $p->SetXTickPos('none'); 28 | $p->SetDrawXGrid(False); 29 | $p->SetDrawYGrid(False); 30 | $p->SetPlotType('lines'); 31 | $p->DrawGraph(); 32 | -------------------------------------------------------------------------------- /phplot/contrib/prune_labels.php: -------------------------------------------------------------------------------- 1 | 0) $data[$i][0] = ''; 34 | if (++$k >= $m) $k = 0; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /phplot/contrib/prune_labels.test.php: -------------------------------------------------------------------------------- 1 | $non_blank labels\n"; 32 | echo substr($line, 0, 80) . "\n"; # Only show first 80 chars. 33 | } 34 | 35 | /* Test cases for prune_labels */ 36 | for ($n = 7; $n <= 1000; $n *= 2) test($n, 10); 37 | for ($g = 5; $g <= 40; $g++) test(72, $g); 38 | # Edge cases 39 | test(80, 41); 40 | test(80, 40); 41 | test(80, 39); 42 | -------------------------------------------------------------------------------- /phplot/rgb.inc.php: -------------------------------------------------------------------------------- 1 | SetRGBArray('large') 6 | * For more information on PHPlot see http://sourceforge.net/projects/phplot/ 7 | * 8 | * rgb.inc.php comes with PHPlot but is derived from the X11 rgb.txt color 9 | * database file, which contains no specific copyright notice. It may be 10 | * covered by X.Org, XFree86, or MIT/X11 copyright and license, all of which 11 | * allow redistribution on terms which are less strict than the LGPL which 12 | * covers PHPlot. 13 | */ 14 | $ColorArray = array( 15 | "snow" => array(255, 250, 250), 16 | "ghost white" => array(248, 248, 255), 17 | "GhostWhite" => array(248, 248, 255), 18 | "white smoke" => array(245, 245, 245), 19 | "WhiteSmoke" => array(245, 245, 245), 20 | "gainsboro" => array(220, 220, 220), 21 | "floral white" => array(255, 250, 240), 22 | "FloralWhite" => array(255, 250, 240), 23 | "old lace" => array(253, 245, 230), 24 | "OldLace" => array(253, 245, 230), 25 | "linen" => array(250, 240, 230), 26 | "antique white" => array(250, 235, 215), 27 | "AntiqueWhite" => array(250, 235, 215), 28 | "papaya whip" => array(255, 239, 213), 29 | "PapayaWhip" => array(255, 239, 213), 30 | "blanched almond" => array(255, 235, 205), 31 | "BlanchedAlmond" => array(255, 235, 205), 32 | "bisque" => array(255, 228, 196), 33 | "peach puff" => array(255, 218, 185), 34 | "PeachPuff" => array(255, 218, 185), 35 | "navajo white" => array(255, 222, 173), 36 | "NavajoWhite" => array(255, 222, 173), 37 | "moccasin" => array(255, 228, 181), 38 | "cornsilk" => array(255, 248, 220), 39 | "ivory" => array(255, 255, 240), 40 | "lemon chiffon" => array(255, 250, 205), 41 | "LemonChiffon" => array(255, 250, 205), 42 | "seashell" => array(255, 245, 238), 43 | "honeydew" => array(240, 255, 240), 44 | "mint cream" => array(245, 255, 250), 45 | "MintCream" => array(245, 255, 250), 46 | "azure" => array(240, 255, 255), 47 | "alice blue" => array(240, 248, 255), 48 | "AliceBlue" => array(240, 248, 255), 49 | "lavender" => array(230, 230, 250), 50 | "lavender blush" => array(255, 240, 245), 51 | "LavenderBlush" => array(255, 240, 245), 52 | "misty rose" => array(255, 228, 225), 53 | "MistyRose" => array(255, 228, 225), 54 | "white" => array(255, 255, 255), 55 | "black" => array( 0, 0, 0), 56 | "dark slate gray" => array( 47, 79, 79), 57 | "DarkSlateGray" => array( 47, 79, 79), 58 | "dark slate grey" => array( 47, 79, 79), 59 | "DarkSlateGrey" => array( 47, 79, 79), 60 | "dim gray" => array(105, 105, 105), 61 | "DimGray" => array(105, 105, 105), 62 | "dim grey" => array(105, 105, 105), 63 | "DimGrey" => array(105, 105, 105), 64 | "slate gray" => array(112, 128, 144), 65 | "SlateGray" => array(112, 128, 144), 66 | "slate grey" => array(112, 128, 144), 67 | "SlateGrey" => array(112, 128, 144), 68 | "light slate gray" => array(119, 136, 153), 69 | "LightSlateGray" => array(119, 136, 153), 70 | "light slate grey" => array(119, 136, 153), 71 | "LightSlateGrey" => array(119, 136, 153), 72 | "gray" => array(190, 190, 190), 73 | "grey" => array(190, 190, 190), 74 | "light grey" => array(211, 211, 211), 75 | "LightGrey" => array(211, 211, 211), 76 | "light gray" => array(211, 211, 211), 77 | "LightGray" => array(211, 211, 211), 78 | "midnight blue" => array( 25, 25, 112), 79 | "MidnightBlue" => array( 25, 25, 112), 80 | "navy" => array( 0, 0, 128), 81 | "navy blue" => array( 0, 0, 128), 82 | "NavyBlue" => array( 0, 0, 128), 83 | "cornflower blue" => array(100, 149, 237), 84 | "CornflowerBlue" => array(100, 149, 237), 85 | "dark slate blue" => array( 72, 61, 139), 86 | "DarkSlateBlue" => array( 72, 61, 139), 87 | "slate blue" => array(106, 90, 205), 88 | "SlateBlue" => array(106, 90, 205), 89 | "medium slate blue" => array(123, 104, 238), 90 | "MediumSlateBlue" => array(123, 104, 238), 91 | "light slate blue" => array(132, 112, 255), 92 | "LightSlateBlue" => array(132, 112, 255), 93 | "medium blue" => array( 0, 0, 205), 94 | "MediumBlue" => array( 0, 0, 205), 95 | "royal blue" => array( 65, 105, 225), 96 | "RoyalBlue" => array( 65, 105, 225), 97 | "blue" => array( 0, 0, 255), 98 | "dodger blue" => array( 30, 144, 255), 99 | "DodgerBlue" => array( 30, 144, 255), 100 | "deep sky blue" => array( 0, 191, 255), 101 | "DeepSkyBlue" => array( 0, 191, 255), 102 | "sky blue" => array(135, 206, 235), 103 | "SkyBlue" => array(135, 206, 235), 104 | "light sky blue" => array(135, 206, 250), 105 | "LightSkyBlue" => array(135, 206, 250), 106 | "steel blue" => array( 70, 130, 180), 107 | "SteelBlue" => array( 70, 130, 180), 108 | "light steel blue" => array(176, 196, 222), 109 | "LightSteelBlue" => array(176, 196, 222), 110 | "light blue" => array(173, 216, 230), 111 | "LightBlue" => array(173, 216, 230), 112 | "powder blue" => array(176, 224, 230), 113 | "PowderBlue" => array(176, 224, 230), 114 | "pale turquoise" => array(175, 238, 238), 115 | "PaleTurquoise" => array(175, 238, 238), 116 | "dark turquoise" => array( 0, 206, 209), 117 | "DarkTurquoise" => array( 0, 206, 209), 118 | "medium turquoise" => array( 72, 209, 204), 119 | "MediumTurquoise" => array( 72, 209, 204), 120 | "turquoise" => array( 64, 224, 208), 121 | "cyan" => array( 0, 255, 255), 122 | "light cyan" => array(224, 255, 255), 123 | "LightCyan" => array(224, 255, 255), 124 | "cadet blue" => array( 95, 158, 160), 125 | "CadetBlue" => array( 95, 158, 160), 126 | "medium aquamarine" => array(102, 205, 170), 127 | "MediumAquamarine" => array(102, 205, 170), 128 | "aquamarine" => array(127, 255, 212), 129 | "dark green" => array( 0, 100, 0), 130 | "DarkGreen" => array( 0, 100, 0), 131 | "dark olive green" => array( 85, 107, 47), 132 | "DarkOliveGreen" => array( 85, 107, 47), 133 | "dark sea green" => array(143, 188, 143), 134 | "DarkSeaGreen" => array(143, 188, 143), 135 | "sea green" => array( 46, 139, 87), 136 | "SeaGreen" => array( 46, 139, 87), 137 | "medium sea green" => array( 60, 179, 113), 138 | "MediumSeaGreen" => array( 60, 179, 113), 139 | "light sea green" => array( 32, 178, 170), 140 | "LightSeaGreen" => array( 32, 178, 170), 141 | "pale green" => array(152, 251, 152), 142 | "PaleGreen" => array(152, 251, 152), 143 | "spring green" => array( 0, 255, 127), 144 | "SpringGreen" => array( 0, 255, 127), 145 | "lawn green" => array(124, 252, 0), 146 | "LawnGreen" => array(124, 252, 0), 147 | "green" => array( 0, 255, 0), 148 | "chartreuse" => array(127, 255, 0), 149 | "medium spring green" => array( 0, 250, 154), 150 | "MediumSpringGreen" => array( 0, 250, 154), 151 | "green yellow" => array(173, 255, 47), 152 | "GreenYellow" => array(173, 255, 47), 153 | "lime green" => array( 50, 205, 50), 154 | "LimeGreen" => array( 50, 205, 50), 155 | "yellow green" => array(154, 205, 50), 156 | "YellowGreen" => array(154, 205, 50), 157 | "forest green" => array( 34, 139, 34), 158 | "ForestGreen" => array( 34, 139, 34), 159 | "olive drab" => array(107, 142, 35), 160 | "OliveDrab" => array(107, 142, 35), 161 | "dark khaki" => array(189, 183, 107), 162 | "DarkKhaki" => array(189, 183, 107), 163 | "khaki" => array(240, 230, 140), 164 | "pale goldenrod" => array(238, 232, 170), 165 | "PaleGoldenrod" => array(238, 232, 170), 166 | "light goldenrod yellow" => array(250, 250, 210), 167 | "LightGoldenrodYellow" => array(250, 250, 210), 168 | "light yellow" => array(255, 255, 224), 169 | "LightYellow" => array(255, 255, 224), 170 | "yellow" => array(255, 255, 0), 171 | "gold" => array(255, 215, 0), 172 | "light goldenrod" => array(238, 221, 130), 173 | "LightGoldenrod" => array(238, 221, 130), 174 | "goldenrod" => array(218, 165, 32), 175 | "dark goldenrod" => array(184, 134, 11), 176 | "DarkGoldenrod" => array(184, 134, 11), 177 | "rosy brown" => array(188, 143, 143), 178 | "RosyBrown" => array(188, 143, 143), 179 | "indian red" => array(205, 92, 92), 180 | "IndianRed" => array(205, 92, 92), 181 | "saddle brown" => array(139, 69, 19), 182 | "SaddleBrown" => array(139, 69, 19), 183 | "sienna" => array(160, 82, 45), 184 | "peru" => array(205, 133, 63), 185 | "burlywood" => array(222, 184, 135), 186 | "beige" => array(245, 245, 220), 187 | "wheat" => array(245, 222, 179), 188 | "sandy brown" => array(244, 164, 96), 189 | "SandyBrown" => array(244, 164, 96), 190 | "tan" => array(210, 180, 140), 191 | "chocolate" => array(210, 105, 30), 192 | "firebrick" => array(178, 34, 34), 193 | "brown" => array(165, 42, 42), 194 | "dark salmon" => array(233, 150, 122), 195 | "DarkSalmon" => array(233, 150, 122), 196 | "salmon" => array(250, 128, 114), 197 | "light salmon" => array(255, 160, 122), 198 | "LightSalmon" => array(255, 160, 122), 199 | "orange" => array(255, 165, 0), 200 | "dark orange" => array(255, 140, 0), 201 | "DarkOrange" => array(255, 140, 0), 202 | "coral" => array(255, 127, 80), 203 | "light coral" => array(240, 128, 128), 204 | "LightCoral" => array(240, 128, 128), 205 | "tomato" => array(255, 99, 71), 206 | "orange red" => array(255, 69, 0), 207 | "OrangeRed" => array(255, 69, 0), 208 | "red" => array(255, 0, 0), 209 | "hot pink" => array(255, 105, 180), 210 | "HotPink" => array(255, 105, 180), 211 | "deep pink" => array(255, 20, 147), 212 | "DeepPink" => array(255, 20, 147), 213 | "pink" => array(255, 192, 203), 214 | "light pink" => array(255, 182, 193), 215 | "LightPink" => array(255, 182, 193), 216 | "pale violet red" => array(219, 112, 147), 217 | "PaleVioletRed" => array(219, 112, 147), 218 | "maroon" => array(176, 48, 96), 219 | "medium violet red" => array(199, 21, 133), 220 | "MediumVioletRed" => array(199, 21, 133), 221 | "violet red" => array(208, 32, 144), 222 | "VioletRed" => array(208, 32, 144), 223 | "magenta" => array(255, 0, 255), 224 | "violet" => array(238, 130, 238), 225 | "plum" => array(221, 160, 221), 226 | "orchid" => array(218, 112, 214), 227 | "medium orchid" => array(186, 85, 211), 228 | "MediumOrchid" => array(186, 85, 211), 229 | "dark orchid" => array(153, 50, 204), 230 | "DarkOrchid" => array(153, 50, 204), 231 | "dark violet" => array(148, 0, 211), 232 | "DarkViolet" => array(148, 0, 211), 233 | "blue violet" => array(138, 43, 226), 234 | "BlueViolet" => array(138, 43, 226), 235 | "purple" => array(160, 32, 240), 236 | "medium purple" => array(147, 112, 219), 237 | "MediumPurple" => array(147, 112, 219), 238 | "thistle" => array(216, 191, 216), 239 | "snow1" => array(255, 250, 250), 240 | "snow2" => array(238, 233, 233), 241 | "snow3" => array(205, 201, 201), 242 | "snow4" => array(139, 137, 137), 243 | "seashell1" => array(255, 245, 238), 244 | "seashell2" => array(238, 229, 222), 245 | "seashell3" => array(205, 197, 191), 246 | "seashell4" => array(139, 134, 130), 247 | "AntiqueWhite1" => array(255, 239, 219), 248 | "AntiqueWhite2" => array(238, 223, 204), 249 | "AntiqueWhite3" => array(205, 192, 176), 250 | "AntiqueWhite4" => array(139, 131, 120), 251 | "bisque1" => array(255, 228, 196), 252 | "bisque2" => array(238, 213, 183), 253 | "bisque3" => array(205, 183, 158), 254 | "bisque4" => array(139, 125, 107), 255 | "PeachPuff1" => array(255, 218, 185), 256 | "PeachPuff2" => array(238, 203, 173), 257 | "PeachPuff3" => array(205, 175, 149), 258 | "PeachPuff4" => array(139, 119, 101), 259 | "NavajoWhite1" => array(255, 222, 173), 260 | "NavajoWhite2" => array(238, 207, 161), 261 | "NavajoWhite3" => array(205, 179, 139), 262 | "NavajoWhite4" => array(139, 121, 94), 263 | "LemonChiffon1" => array(255, 250, 205), 264 | "LemonChiffon2" => array(238, 233, 191), 265 | "LemonChiffon3" => array(205, 201, 165), 266 | "LemonChiffon4" => array(139, 137, 112), 267 | "cornsilk1" => array(255, 248, 220), 268 | "cornsilk2" => array(238, 232, 205), 269 | "cornsilk3" => array(205, 200, 177), 270 | "cornsilk4" => array(139, 136, 120), 271 | "ivory1" => array(255, 255, 240), 272 | "ivory2" => array(238, 238, 224), 273 | "ivory3" => array(205, 205, 193), 274 | "ivory4" => array(139, 139, 131), 275 | "honeydew1" => array(240, 255, 240), 276 | "honeydew2" => array(224, 238, 224), 277 | "honeydew3" => array(193, 205, 193), 278 | "honeydew4" => array(131, 139, 131), 279 | "LavenderBlush1" => array(255, 240, 245), 280 | "LavenderBlush2" => array(238, 224, 229), 281 | "LavenderBlush3" => array(205, 193, 197), 282 | "LavenderBlush4" => array(139, 131, 134), 283 | "MistyRose1" => array(255, 228, 225), 284 | "MistyRose2" => array(238, 213, 210), 285 | "MistyRose3" => array(205, 183, 181), 286 | "MistyRose4" => array(139, 125, 123), 287 | "azure1" => array(240, 255, 255), 288 | "azure2" => array(224, 238, 238), 289 | "azure3" => array(193, 205, 205), 290 | "azure4" => array(131, 139, 139), 291 | "SlateBlue1" => array(131, 111, 255), 292 | "SlateBlue2" => array(122, 103, 238), 293 | "SlateBlue3" => array(105, 89, 205), 294 | "SlateBlue4" => array( 71, 60, 139), 295 | "RoyalBlue1" => array( 72, 118, 255), 296 | "RoyalBlue2" => array( 67, 110, 238), 297 | "RoyalBlue3" => array( 58, 95, 205), 298 | "RoyalBlue4" => array( 39, 64, 139), 299 | "blue1" => array( 0, 0, 255), 300 | "blue2" => array( 0, 0, 238), 301 | "blue3" => array( 0, 0, 205), 302 | "blue4" => array( 0, 0, 139), 303 | "DodgerBlue1" => array( 30, 144, 255), 304 | "DodgerBlue2" => array( 28, 134, 238), 305 | "DodgerBlue3" => array( 24, 116, 205), 306 | "DodgerBlue4" => array( 16, 78, 139), 307 | "SteelBlue1" => array( 99, 184, 255), 308 | "SteelBlue2" => array( 92, 172, 238), 309 | "SteelBlue3" => array( 79, 148, 205), 310 | "SteelBlue4" => array( 54, 100, 139), 311 | "DeepSkyBlue1" => array( 0, 191, 255), 312 | "DeepSkyBlue2" => array( 0, 178, 238), 313 | "DeepSkyBlue3" => array( 0, 154, 205), 314 | "DeepSkyBlue4" => array( 0, 104, 139), 315 | "SkyBlue1" => array(135, 206, 255), 316 | "SkyBlue2" => array(126, 192, 238), 317 | "SkyBlue3" => array(108, 166, 205), 318 | "SkyBlue4" => array( 74, 112, 139), 319 | "LightSkyBlue1" => array(176, 226, 255), 320 | "LightSkyBlue2" => array(164, 211, 238), 321 | "LightSkyBlue3" => array(141, 182, 205), 322 | "LightSkyBlue4" => array( 96, 123, 139), 323 | "SlateGray1" => array(198, 226, 255), 324 | "SlateGray2" => array(185, 211, 238), 325 | "SlateGray3" => array(159, 182, 205), 326 | "SlateGray4" => array(108, 123, 139), 327 | "LightSteelBlue1" => array(202, 225, 255), 328 | "LightSteelBlue2" => array(188, 210, 238), 329 | "LightSteelBlue3" => array(162, 181, 205), 330 | "LightSteelBlue4" => array(110, 123, 139), 331 | "LightBlue1" => array(191, 239, 255), 332 | "LightBlue2" => array(178, 223, 238), 333 | "LightBlue3" => array(154, 192, 205), 334 | "LightBlue4" => array(104, 131, 139), 335 | "LightCyan1" => array(224, 255, 255), 336 | "LightCyan2" => array(209, 238, 238), 337 | "LightCyan3" => array(180, 205, 205), 338 | "LightCyan4" => array(122, 139, 139), 339 | "PaleTurquoise1" => array(187, 255, 255), 340 | "PaleTurquoise2" => array(174, 238, 238), 341 | "PaleTurquoise3" => array(150, 205, 205), 342 | "PaleTurquoise4" => array(102, 139, 139), 343 | "CadetBlue1" => array(152, 245, 255), 344 | "CadetBlue2" => array(142, 229, 238), 345 | "CadetBlue3" => array(122, 197, 205), 346 | "CadetBlue4" => array( 83, 134, 139), 347 | "turquoise1" => array( 0, 245, 255), 348 | "turquoise2" => array( 0, 229, 238), 349 | "turquoise3" => array( 0, 197, 205), 350 | "turquoise4" => array( 0, 134, 139), 351 | "cyan1" => array( 0, 255, 255), 352 | "cyan2" => array( 0, 238, 238), 353 | "cyan3" => array( 0, 205, 205), 354 | "cyan4" => array( 0, 139, 139), 355 | "DarkSlateGray1" => array(151, 255, 255), 356 | "DarkSlateGray2" => array(141, 238, 238), 357 | "DarkSlateGray3" => array(121, 205, 205), 358 | "DarkSlateGray4" => array( 82, 139, 139), 359 | "aquamarine1" => array(127, 255, 212), 360 | "aquamarine2" => array(118, 238, 198), 361 | "aquamarine3" => array(102, 205, 170), 362 | "aquamarine4" => array( 69, 139, 116), 363 | "DarkSeaGreen1" => array(193, 255, 193), 364 | "DarkSeaGreen2" => array(180, 238, 180), 365 | "DarkSeaGreen3" => array(155, 205, 155), 366 | "DarkSeaGreen4" => array(105, 139, 105), 367 | "SeaGreen1" => array( 84, 255, 159), 368 | "SeaGreen2" => array( 78, 238, 148), 369 | "SeaGreen3" => array( 67, 205, 128), 370 | "SeaGreen4" => array( 46, 139, 87), 371 | "PaleGreen1" => array(154, 255, 154), 372 | "PaleGreen2" => array(144, 238, 144), 373 | "PaleGreen3" => array(124, 205, 124), 374 | "PaleGreen4" => array( 84, 139, 84), 375 | "SpringGreen1" => array( 0, 255, 127), 376 | "SpringGreen2" => array( 0, 238, 118), 377 | "SpringGreen3" => array( 0, 205, 102), 378 | "SpringGreen4" => array( 0, 139, 69), 379 | "green1" => array( 0, 255, 0), 380 | "green2" => array( 0, 238, 0), 381 | "green3" => array( 0, 205, 0), 382 | "green4" => array( 0, 139, 0), 383 | "chartreuse1" => array(127, 255, 0), 384 | "chartreuse2" => array(118, 238, 0), 385 | "chartreuse3" => array(102, 205, 0), 386 | "chartreuse4" => array( 69, 139, 0), 387 | "OliveDrab1" => array(192, 255, 62), 388 | "OliveDrab2" => array(179, 238, 58), 389 | "OliveDrab3" => array(154, 205, 50), 390 | "OliveDrab4" => array(105, 139, 34), 391 | "DarkOliveGreen1" => array(202, 255, 112), 392 | "DarkOliveGreen2" => array(188, 238, 104), 393 | "DarkOliveGreen3" => array(162, 205, 90), 394 | "DarkOliveGreen4" => array(110, 139, 61), 395 | "khaki1" => array(255, 246, 143), 396 | "khaki2" => array(238, 230, 133), 397 | "khaki3" => array(205, 198, 115), 398 | "khaki4" => array(139, 134, 78), 399 | "LightGoldenrod1" => array(255, 236, 139), 400 | "LightGoldenrod2" => array(238, 220, 130), 401 | "LightGoldenrod3" => array(205, 190, 112), 402 | "LightGoldenrod4" => array(139, 129, 76), 403 | "LightYellow1" => array(255, 255, 224), 404 | "LightYellow2" => array(238, 238, 209), 405 | "LightYellow3" => array(205, 205, 180), 406 | "LightYellow4" => array(139, 139, 122), 407 | "yellow1" => array(255, 255, 0), 408 | "yellow2" => array(238, 238, 0), 409 | "yellow3" => array(205, 205, 0), 410 | "yellow4" => array(139, 139, 0), 411 | "gold1" => array(255, 215, 0), 412 | "gold2" => array(238, 201, 0), 413 | "gold3" => array(205, 173, 0), 414 | "gold4" => array(139, 117, 0), 415 | "goldenrod1" => array(255, 193, 37), 416 | "goldenrod2" => array(238, 180, 34), 417 | "goldenrod3" => array(205, 155, 29), 418 | "goldenrod4" => array(139, 105, 20), 419 | "DarkGoldenrod1" => array(255, 185, 15), 420 | "DarkGoldenrod2" => array(238, 173, 14), 421 | "DarkGoldenrod3" => array(205, 149, 12), 422 | "DarkGoldenrod4" => array(139, 101, 8), 423 | "RosyBrown1" => array(255, 193, 193), 424 | "RosyBrown2" => array(238, 180, 180), 425 | "RosyBrown3" => array(205, 155, 155), 426 | "RosyBrown4" => array(139, 105, 105), 427 | "IndianRed1" => array(255, 106, 106), 428 | "IndianRed2" => array(238, 99, 99), 429 | "IndianRed3" => array(205, 85, 85), 430 | "IndianRed4" => array(139, 58, 58), 431 | "sienna1" => array(255, 130, 71), 432 | "sienna2" => array(238, 121, 66), 433 | "sienna3" => array(205, 104, 57), 434 | "sienna4" => array(139, 71, 38), 435 | "burlywood1" => array(255, 211, 155), 436 | "burlywood2" => array(238, 197, 145), 437 | "burlywood3" => array(205, 170, 125), 438 | "burlywood4" => array(139, 115, 85), 439 | "wheat1" => array(255, 231, 186), 440 | "wheat2" => array(238, 216, 174), 441 | "wheat3" => array(205, 186, 150), 442 | "wheat4" => array(139, 126, 102), 443 | "tan1" => array(255, 165, 79), 444 | "tan2" => array(238, 154, 73), 445 | "tan3" => array(205, 133, 63), 446 | "tan4" => array(139, 90, 43), 447 | "chocolate1" => array(255, 127, 36), 448 | "chocolate2" => array(238, 118, 33), 449 | "chocolate3" => array(205, 102, 29), 450 | "chocolate4" => array(139, 69, 19), 451 | "firebrick1" => array(255, 48, 48), 452 | "firebrick2" => array(238, 44, 44), 453 | "firebrick3" => array(205, 38, 38), 454 | "firebrick4" => array(139, 26, 26), 455 | "brown1" => array(255, 64, 64), 456 | "brown2" => array(238, 59, 59), 457 | "brown3" => array(205, 51, 51), 458 | "brown4" => array(139, 35, 35), 459 | "salmon1" => array(255, 140, 105), 460 | "salmon2" => array(238, 130, 98), 461 | "salmon3" => array(205, 112, 84), 462 | "salmon4" => array(139, 76, 57), 463 | "LightSalmon1" => array(255, 160, 122), 464 | "LightSalmon2" => array(238, 149, 114), 465 | "LightSalmon3" => array(205, 129, 98), 466 | "LightSalmon4" => array(139, 87, 66), 467 | "orange1" => array(255, 165, 0), 468 | "orange2" => array(238, 154, 0), 469 | "orange3" => array(205, 133, 0), 470 | "orange4" => array(139, 90, 0), 471 | "DarkOrange1" => array(255, 127, 0), 472 | "DarkOrange2" => array(238, 118, 0), 473 | "DarkOrange3" => array(205, 102, 0), 474 | "DarkOrange4" => array(139, 69, 0), 475 | "coral1" => array(255, 114, 86), 476 | "coral2" => array(238, 106, 80), 477 | "coral3" => array(205, 91, 69), 478 | "coral4" => array(139, 62, 47), 479 | "tomato1" => array(255, 99, 71), 480 | "tomato2" => array(238, 92, 66), 481 | "tomato3" => array(205, 79, 57), 482 | "tomato4" => array(139, 54, 38), 483 | "OrangeRed1" => array(255, 69, 0), 484 | "OrangeRed2" => array(238, 64, 0), 485 | "OrangeRed3" => array(205, 55, 0), 486 | "OrangeRed4" => array(139, 37, 0), 487 | "red1" => array(255, 0, 0), 488 | "red2" => array(238, 0, 0), 489 | "red3" => array(205, 0, 0), 490 | "red4" => array(139, 0, 0), 491 | "DeepPink1" => array(255, 20, 147), 492 | "DeepPink2" => array(238, 18, 137), 493 | "DeepPink3" => array(205, 16, 118), 494 | "DeepPink4" => array(139, 10, 80), 495 | "HotPink1" => array(255, 110, 180), 496 | "HotPink2" => array(238, 106, 167), 497 | "HotPink3" => array(205, 96, 144), 498 | "HotPink4" => array(139, 58, 98), 499 | "pink1" => array(255, 181, 197), 500 | "pink2" => array(238, 169, 184), 501 | "pink3" => array(205, 145, 158), 502 | "pink4" => array(139, 99, 108), 503 | "LightPink1" => array(255, 174, 185), 504 | "LightPink2" => array(238, 162, 173), 505 | "LightPink3" => array(205, 140, 149), 506 | "LightPink4" => array(139, 95, 101), 507 | "PaleVioletRed1" => array(255, 130, 171), 508 | "PaleVioletRed2" => array(238, 121, 159), 509 | "PaleVioletRed3" => array(205, 104, 137), 510 | "PaleVioletRed4" => array(139, 71, 93), 511 | "maroon1" => array(255, 52, 179), 512 | "maroon2" => array(238, 48, 167), 513 | "maroon3" => array(205, 41, 144), 514 | "maroon4" => array(139, 28, 98), 515 | "VioletRed1" => array(255, 62, 150), 516 | "VioletRed2" => array(238, 58, 140), 517 | "VioletRed3" => array(205, 50, 120), 518 | "VioletRed4" => array(139, 34, 82), 519 | "magenta1" => array(255, 0, 255), 520 | "magenta2" => array(238, 0, 238), 521 | "magenta3" => array(205, 0, 205), 522 | "magenta4" => array(139, 0, 139), 523 | "orchid1" => array(255, 131, 250), 524 | "orchid2" => array(238, 122, 233), 525 | "orchid3" => array(205, 105, 201), 526 | "orchid4" => array(139, 71, 137), 527 | "plum1" => array(255, 187, 255), 528 | "plum2" => array(238, 174, 238), 529 | "plum3" => array(205, 150, 205), 530 | "plum4" => array(139, 102, 139), 531 | "MediumOrchid1" => array(224, 102, 255), 532 | "MediumOrchid2" => array(209, 95, 238), 533 | "MediumOrchid3" => array(180, 82, 205), 534 | "MediumOrchid4" => array(122, 55, 139), 535 | "DarkOrchid1" => array(191, 62, 255), 536 | "DarkOrchid2" => array(178, 58, 238), 537 | "DarkOrchid3" => array(154, 50, 205), 538 | "DarkOrchid4" => array(104, 34, 139), 539 | "purple1" => array(155, 48, 255), 540 | "purple2" => array(145, 44, 238), 541 | "purple3" => array(125, 38, 205), 542 | "purple4" => array( 85, 26, 139), 543 | "MediumPurple1" => array(171, 130, 255), 544 | "MediumPurple2" => array(159, 121, 238), 545 | "MediumPurple3" => array(137, 104, 205), 546 | "MediumPurple4" => array( 93, 71, 139), 547 | "thistle1" => array(255, 225, 255), 548 | "thistle2" => array(238, 210, 238), 549 | "thistle3" => array(205, 181, 205), 550 | "thistle4" => array(139, 123, 139), 551 | "gray0" => array( 0, 0, 0), 552 | "grey0" => array( 0, 0, 0), 553 | "gray1" => array( 3, 3, 3), 554 | "grey1" => array( 3, 3, 3), 555 | "gray2" => array( 5, 5, 5), 556 | "grey2" => array( 5, 5, 5), 557 | "gray3" => array( 8, 8, 8), 558 | "grey3" => array( 8, 8, 8), 559 | "gray4" => array( 10, 10, 10), 560 | "grey4" => array( 10, 10, 10), 561 | "gray5" => array( 13, 13, 13), 562 | "grey5" => array( 13, 13, 13), 563 | "gray6" => array( 15, 15, 15), 564 | "grey6" => array( 15, 15, 15), 565 | "gray7" => array( 18, 18, 18), 566 | "grey7" => array( 18, 18, 18), 567 | "gray8" => array( 20, 20, 20), 568 | "grey8" => array( 20, 20, 20), 569 | "gray9" => array( 23, 23, 23), 570 | "grey9" => array( 23, 23, 23), 571 | "gray10" => array( 26, 26, 26), 572 | "grey10" => array( 26, 26, 26), 573 | "gray11" => array( 28, 28, 28), 574 | "grey11" => array( 28, 28, 28), 575 | "gray12" => array( 31, 31, 31), 576 | "grey12" => array( 31, 31, 31), 577 | "gray13" => array( 33, 33, 33), 578 | "grey13" => array( 33, 33, 33), 579 | "gray14" => array( 36, 36, 36), 580 | "grey14" => array( 36, 36, 36), 581 | "gray15" => array( 38, 38, 38), 582 | "grey15" => array( 38, 38, 38), 583 | "gray16" => array( 41, 41, 41), 584 | "grey16" => array( 41, 41, 41), 585 | "gray17" => array( 43, 43, 43), 586 | "grey17" => array( 43, 43, 43), 587 | "gray18" => array( 46, 46, 46), 588 | "grey18" => array( 46, 46, 46), 589 | "gray19" => array( 48, 48, 48), 590 | "grey19" => array( 48, 48, 48), 591 | "gray20" => array( 51, 51, 51), 592 | "grey20" => array( 51, 51, 51), 593 | "gray21" => array( 54, 54, 54), 594 | "grey21" => array( 54, 54, 54), 595 | "gray22" => array( 56, 56, 56), 596 | "grey22" => array( 56, 56, 56), 597 | "gray23" => array( 59, 59, 59), 598 | "grey23" => array( 59, 59, 59), 599 | "gray24" => array( 61, 61, 61), 600 | "grey24" => array( 61, 61, 61), 601 | "gray25" => array( 64, 64, 64), 602 | "grey25" => array( 64, 64, 64), 603 | "gray26" => array( 66, 66, 66), 604 | "grey26" => array( 66, 66, 66), 605 | "gray27" => array( 69, 69, 69), 606 | "grey27" => array( 69, 69, 69), 607 | "gray28" => array( 71, 71, 71), 608 | "grey28" => array( 71, 71, 71), 609 | "gray29" => array( 74, 74, 74), 610 | "grey29" => array( 74, 74, 74), 611 | "gray30" => array( 77, 77, 77), 612 | "grey30" => array( 77, 77, 77), 613 | "gray31" => array( 79, 79, 79), 614 | "grey31" => array( 79, 79, 79), 615 | "gray32" => array( 82, 82, 82), 616 | "grey32" => array( 82, 82, 82), 617 | "gray33" => array( 84, 84, 84), 618 | "grey33" => array( 84, 84, 84), 619 | "gray34" => array( 87, 87, 87), 620 | "grey34" => array( 87, 87, 87), 621 | "gray35" => array( 89, 89, 89), 622 | "grey35" => array( 89, 89, 89), 623 | "gray36" => array( 92, 92, 92), 624 | "grey36" => array( 92, 92, 92), 625 | "gray37" => array( 94, 94, 94), 626 | "grey37" => array( 94, 94, 94), 627 | "gray38" => array( 97, 97, 97), 628 | "grey38" => array( 97, 97, 97), 629 | "gray39" => array( 99, 99, 99), 630 | "grey39" => array( 99, 99, 99), 631 | "gray40" => array(102, 102, 102), 632 | "grey40" => array(102, 102, 102), 633 | "gray41" => array(105, 105, 105), 634 | "grey41" => array(105, 105, 105), 635 | "gray42" => array(107, 107, 107), 636 | "grey42" => array(107, 107, 107), 637 | "gray43" => array(110, 110, 110), 638 | "grey43" => array(110, 110, 110), 639 | "gray44" => array(112, 112, 112), 640 | "grey44" => array(112, 112, 112), 641 | "gray45" => array(115, 115, 115), 642 | "grey45" => array(115, 115, 115), 643 | "gray46" => array(117, 117, 117), 644 | "grey46" => array(117, 117, 117), 645 | "gray47" => array(120, 120, 120), 646 | "grey47" => array(120, 120, 120), 647 | "gray48" => array(122, 122, 122), 648 | "grey48" => array(122, 122, 122), 649 | "gray49" => array(125, 125, 125), 650 | "grey49" => array(125, 125, 125), 651 | "gray50" => array(127, 127, 127), 652 | "grey50" => array(127, 127, 127), 653 | "gray51" => array(130, 130, 130), 654 | "grey51" => array(130, 130, 130), 655 | "gray52" => array(133, 133, 133), 656 | "grey52" => array(133, 133, 133), 657 | "gray53" => array(135, 135, 135), 658 | "grey53" => array(135, 135, 135), 659 | "gray54" => array(138, 138, 138), 660 | "grey54" => array(138, 138, 138), 661 | "gray55" => array(140, 140, 140), 662 | "grey55" => array(140, 140, 140), 663 | "gray56" => array(143, 143, 143), 664 | "grey56" => array(143, 143, 143), 665 | "gray57" => array(145, 145, 145), 666 | "grey57" => array(145, 145, 145), 667 | "gray58" => array(148, 148, 148), 668 | "grey58" => array(148, 148, 148), 669 | "gray59" => array(150, 150, 150), 670 | "grey59" => array(150, 150, 150), 671 | "gray60" => array(153, 153, 153), 672 | "grey60" => array(153, 153, 153), 673 | "gray61" => array(156, 156, 156), 674 | "grey61" => array(156, 156, 156), 675 | "gray62" => array(158, 158, 158), 676 | "grey62" => array(158, 158, 158), 677 | "gray63" => array(161, 161, 161), 678 | "grey63" => array(161, 161, 161), 679 | "gray64" => array(163, 163, 163), 680 | "grey64" => array(163, 163, 163), 681 | "gray65" => array(166, 166, 166), 682 | "grey65" => array(166, 166, 166), 683 | "gray66" => array(168, 168, 168), 684 | "grey66" => array(168, 168, 168), 685 | "gray67" => array(171, 171, 171), 686 | "grey67" => array(171, 171, 171), 687 | "gray68" => array(173, 173, 173), 688 | "grey68" => array(173, 173, 173), 689 | "gray69" => array(176, 176, 176), 690 | "grey69" => array(176, 176, 176), 691 | "gray70" => array(179, 179, 179), 692 | "grey70" => array(179, 179, 179), 693 | "gray71" => array(181, 181, 181), 694 | "grey71" => array(181, 181, 181), 695 | "gray72" => array(184, 184, 184), 696 | "grey72" => array(184, 184, 184), 697 | "gray73" => array(186, 186, 186), 698 | "grey73" => array(186, 186, 186), 699 | "gray74" => array(189, 189, 189), 700 | "grey74" => array(189, 189, 189), 701 | "gray75" => array(191, 191, 191), 702 | "grey75" => array(191, 191, 191), 703 | "gray76" => array(194, 194, 194), 704 | "grey76" => array(194, 194, 194), 705 | "gray77" => array(196, 196, 196), 706 | "grey77" => array(196, 196, 196), 707 | "gray78" => array(199, 199, 199), 708 | "grey78" => array(199, 199, 199), 709 | "gray79" => array(201, 201, 201), 710 | "grey79" => array(201, 201, 201), 711 | "gray80" => array(204, 204, 204), 712 | "grey80" => array(204, 204, 204), 713 | "gray81" => array(207, 207, 207), 714 | "grey81" => array(207, 207, 207), 715 | "gray82" => array(209, 209, 209), 716 | "grey82" => array(209, 209, 209), 717 | "gray83" => array(212, 212, 212), 718 | "grey83" => array(212, 212, 212), 719 | "gray84" => array(214, 214, 214), 720 | "grey84" => array(214, 214, 214), 721 | "gray85" => array(217, 217, 217), 722 | "grey85" => array(217, 217, 217), 723 | "gray86" => array(219, 219, 219), 724 | "grey86" => array(219, 219, 219), 725 | "gray87" => array(222, 222, 222), 726 | "grey87" => array(222, 222, 222), 727 | "gray88" => array(224, 224, 224), 728 | "grey88" => array(224, 224, 224), 729 | "gray89" => array(227, 227, 227), 730 | "grey89" => array(227, 227, 227), 731 | "gray90" => array(229, 229, 229), 732 | "grey90" => array(229, 229, 229), 733 | "gray91" => array(232, 232, 232), 734 | "grey91" => array(232, 232, 232), 735 | "gray92" => array(235, 235, 235), 736 | "grey92" => array(235, 235, 235), 737 | "gray93" => array(237, 237, 237), 738 | "grey93" => array(237, 237, 237), 739 | "gray94" => array(240, 240, 240), 740 | "grey94" => array(240, 240, 240), 741 | "gray95" => array(242, 242, 242), 742 | "grey95" => array(242, 242, 242), 743 | "gray96" => array(245, 245, 245), 744 | "grey96" => array(245, 245, 245), 745 | "gray97" => array(247, 247, 247), 746 | "grey97" => array(247, 247, 247), 747 | "gray98" => array(250, 250, 250), 748 | "grey98" => array(250, 250, 250), 749 | "gray99" => array(252, 252, 252), 750 | "grey99" => array(252, 252, 252), 751 | "gray100" => array(255, 255, 255) 752 | ); 753 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 |

DEPRECATED Repository

2 | 3 | This unofficial repository for PHPlot has been deprecated, as upstream is now managed at GitHub and already has Composer support. 4 | 5 | Please use the official repository: 6 | https://github.com/AJRepo/PHPlot 7 | --------------------------------------------------------------------------------