The widgets all operate on the same underlying object, a student. If the various widgets each use a small subset of the student data, and if they also frequently are displayed alone (i.e. just one widget on a page), or if some widgets that aren't frequently displayed rely on costly queries then it might make sense to let the widgets deal with mapping themselves. Moreover, if these widgets work on data from one table each, the TDG is a way to go. But, in this case, each widget would imply a query, which can generally be expected to reduce efficiency over pulling all or most data with one query.
If you frequently display all/most widgets, or they each need most of the student data set, I'd let a student class deal with data mapping. And even in the above case, you could go with this appraoch, but let the student class use lazy loading for infrequently used widgets depending on performance costly queries so you don't end up unnecessarily pulling performance costly data sets from the db. Until they are needed.
As such, I'd probably go with mapping student to db, with or without lazy loading, and let the widgets get their data from this object.
Table Data Gateway implies that you're operating on a table or subset thereof, just as the row data gateway implies working on a table row or subset thereof. In your case, you are most likely working with several tables; a single row from some (student table), several from others (student_takes_courses table and course table).
Since you seem to be dealing with only mapping one class to the database, you could encapsulate this in the student class. If you want to put in the extra work of decoupling the student class from the db schema, look into using a data mapper.
If you anticipate the need for displaying data for several students in the future, create a registry to hold the students, otherwise it can be a singleton.
I'm assuming that your widgets all work on two dimensional data sets. No matter what the data represents, the structure should be able to stay the same for all widgets. The difference just lies in the textual output for the axis' (considering a pie chart slice as an axis) labels. For this purpose, I would probably let each actual widget extend Widget, pass them the student at construction and let each widget get the data it needs from the student by using public getter methods. If you implement lazy loading, the student object will deal with pulling more data from the db if it isn't prefetched.
For the output, look into the decorator pattern. Instead of having a renderer as a widget member, you have a reference to the widget as a member of the decorator. Also, give the decorators the ability to create output for html, json and uri. I.e. three render methods, not one. Where "create output" means returning the data, not echoing it.