Any interest in this and more ?
Nice. You could put it up in the WIKI in the hacks section http://www.zenphoto.org/trac/wiki/ZenphotoHacks
I sure am. I'll pretty up the code a bit, it's really pretty simple.
function pie_graph($col,$title)
{
$sql = "SELECT count( ".$col." ) , ".$col." FROM images GROUP BY ".$col." ORDER BY count( ".$col." ) DESC LIMIT 5";
$result = mysql_query($sql);
while($r = mysql_fetch_array($result)) {
$current_Label = $r[1];
if (empty($current_Label)) { $Label .= 'Unknown|';
} else {
$Label .= $r[1].'|'; }
$Values .= $r[0].',';
}
$Label=trim($Label,"|");
$Values=trim($Values,",");
echo '';
}
That's fantastic. I just added this to my gallery http://t413.com/gallery/ and I am very impressed.
I really would like a line graph or histogram of when pictures were taken, showing how many per week, day, or month. I think that would be even more impressive. Google analytics can show how many people visit my site and when but it would be neat to see how many pictures were taken and when. The mysql database already has date information, although I'm not familiar enough with how to use it for this.
Good job and thanks for such an awesome new feature.
Yes, I was thinking of doing that, it wouldn't be that difficult but it would be best to provide a UI so one could zoom in and look at different periods. Now that I think of it, it's quite an UI challenge I'll try to whip out something but I don't know PHP very well (or at all).
I wouldn't mind an excuse to build a sparkline too
Hey, I've been working with the function you created because I knew the data it was returning to be inaccurate. I looked through http://code.google.com/apis/chart/ and found that the type of encoding you used (text encoding) only accepts values from 0 to 100. On my gallery I've got 14,459 photos, 10,998 of which were taken by my XTi. When graphed any values over 100 were kept at 100, making the graph absolutely wrong. I fixed that in my the revised function below by turning each value into a percentage. Also, the "unknown" label was not working for my data, and by changing the $sql = line to match code I generated with phpmyadmin I got it to work. Now it doesn't show that I use flash on a quarter of all photos but rather less than one percent.
`
``function pie_graph($col,$title)
{
$sql = "SELECT count( * ) AS Rows , ".$col." FROM images GROUP BY ".$col." ORDER BY ".$col." LIMIT 0, 30";
$result = mysql_query($sql);
while($r = mysql_fetch_array($result)) {
$current_Label = $r[1];
if (empty($current_Label)) { $Label .= 'Unknown|';
} else {
$Label .= $r[1].'|'; }
$Values .= ( ($r[0])/100 ).',';
}
$Label=trim($Label,"|");
$Values=trim($Values,",");
}`
Oops, that's not the one with the percentage, that just divides the result by 100. This is the right function:
`
function pie_graph($col,$title)
{
$photosArray = query_single_row("SELECT count(*) FROM ".prefix('images'));
$photosNumber = array_shift($photosArray); //get total number of images
$sql = "SELECT count( * ) AS Rows , ".$col." FROM images GROUP BY ".$col." ORDER BY ".$col." LIMIT 0, 30";
$result = mysql_query($sql);
while($r = mysql_fetch_array($result)) {
$current_Label = $r[1];
if (empty($current_Label)) { $Label .= 'Unknown|';
} else {
$Label .= $r[1].'|'; }
$Values .= round( (($r[0])/$photosNumber*100),2).',';
}
$Label=trim($Label,"|");
$Values=trim($Values,",");
}
`
I'm interested to see your timeline bar graph function, I'd like to work on it myself but don't really have a good enough handle on mysql to know where to start.
The text encoding you used for generating the graphs is almost ideal for the pie_graph() function you wrote, extended encoding is not any better for this purpose.
I think this statistics graph idea deserves a prominent spot on the hacks page and will show up in themes before long.
Ok, so several things:
images WHERE date IS NOT NULL GROUP BY DATE( date ) ORDER BY DATE( date ) DESC LIMIT 62It retrieves the last 62 days with photos (that's all you can plot with google charts unless you want to plot by month or by another slice of time than day and then you have to do some arithmetic).
The encoding doesn't really matter as long as you normalize prior to plotting, as you mentioned in your post. That's an early mistake I had made.
I have to be smarter in my pie charts. Though I take most photos with the same cameras across the years (Canon Digital Elph 100, EOS D30, S30, EOS 1D, S50, EOS 5D, G9) I have at times borrowed cameras to make a shot and as a results there is too much noise. So I really need to display of those above 5%, Unknown (I think Photoshop did not maintain EXIF data early on) and a group of Miscellaneous for all known cameras under 5% usage.
I think the same must apply to ISO, F/STOP, Focal Length, Focal Length Equivalent. It might be also useful to display focal length for SLR cameras only as the Focal Length or FL equivalent for compacts is just not as interesting.
For the timeline chart, there is a lot more to do than the SQL query. We have to decide on the unit (days won't work unless you plot the last 62 days only where you might actually plot any value or few since you might not have shot much in the last 2 months). So let's pick months for example. You have to use the SQL results and figure out how many photos were taken that month. Of course, you can modify the query so it doesn't group by day but by months.
At some point, we might want to move away from google charts though it's easy to use and free (as in free beer) so we can put links, display data when mousing over (what albums contain photos taken that month. It'd be nice to know that that big bump in February was your friend's wedding for example.
A lot more work, indeed.