<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4252897967377552012</id><updated>2011-10-06T07:16:15.167-07:00</updated><title type='text'>James' infovis thinking blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-8443132840747633234</id><published>2011-01-14T20:22:00.001-08:00</published><updated>2011-01-14T20:39:57.854-08:00</updated><title type='text'>Prefuse Out of Memory Error</title><content type='html'>&lt;span class="Apple-style-span"&gt;In my recent coding with Prefuse, I got a severe OutOfMemoryException, which almost jeopardy my dissertation project. Here is the case I got.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre-wrap; "&gt;I have a visualization that renders ~50MB table data in X-Y axis layout. I need to change the table data when users choose another data file. But the problem is that, even I used&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 15px; "&gt;m_vis.removeGroup("groupname");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 15px; "&gt; m_vis.addTable("groupname", table);&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 15px; "&gt;m_vis.run("actionname1");&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 15px; "&gt;&lt;span class="Apple-style-span"&gt;m_vis.run("actionname1");&lt;/span&gt;&lt;span class="Apple-style-span"&gt; ....&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 15px; "&gt;Or I create a new Visualization and Display, remove the previous Display from the common container, like a JPanel, and add this newly created Display.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(94, 94, 94); line-height: 16px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 15px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 16px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 15px; "&gt;These two method both work fine in terms of creating a nice image. &lt;span class="Apple-style-span"&gt;BUT!!!!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(94, 94, 94); line-height: 16px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 15px; font-size: 13px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; " &gt;After rendering a few data files, it has a out of memory problem. I watch the memory usage info. I found that the previous visualization and data are not cleaned by the garbage collection function. So each image and data are still in memory, and soon it claimed all memory reserved by JVM.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; " &gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span" &gt;After digging into other threads in the Sorucefore' Prefuse forum, I think I find the answer which partially (90%) solve my problem.  Here is the thread that discuss the nearly same problem.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span" &gt; &lt;a href="https://sourceforge.net/projects/prefuse/forums/forum/343013/topic/1809861" style="text-decoration: none; "&gt;https://sourceforge.net/projects/prefuse/forums/forum/343013/topic/1809861&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span" &gt;&lt;a href="https://sourceforge.net/projects/prefuse/forums/forum/343013/topic/1809861" style="text-decoration: none; "&gt;&lt;/a&gt; The only difference is that they used graph as base data, while I am using Table as base data.  The reason to cause the out of memory problem is that Display will NOT automatically destroy its buffered off-screen image and activities. Also unused data will NOT automatically lost its reference to the TupleSet and registered listeners. Since these data still has valid references, JVM cannot collect the memory they took.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span" &gt;In the beta version, Heer fix the above problems by adding a new method in Display, called reset(), which will set m_offscreen to NULL, and clean queue, and by adding a removeAllGraphListener() in Graph and removeAllTableListener() in Table to clean up all registered listeners to base data structure.  So here is the solution to reclaim memory unused by a Display. You need to create a public method to do the cleanup, e.g. a method like&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span" &gt; public void cleanup()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span" &gt; Then do the following in this method.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span" &gt; 1.  Display.setVisualization(null)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span" &gt; 2.  Display.reset();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span" &gt; For the base data used in Visualization in this Display. Do these.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span" &gt; 1.  Table( or Graph).removeAllTable(or Graph)Listener();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" &gt; 2.  Table( or Graph).clear();  After call this cleanup method, do garbage collection, e.g. Runtime.getRuntime.gc() or System.gc(); The majority of unused memory will be relocated.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; " &gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; "&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;   In my case, there is still a few un-release memory, ~10MB. That is why I said, it is partially (90%) solved&lt;/span&gt;.&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; font-size: 13px; "&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 15px; white-space: pre-wrap; "&gt;&lt;span class="Apple-style-span" style="line-height: 16px; "&gt;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, clean, sans-serif; font-size: 13px; color: rgb(94, 94, 94); "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-8443132840747633234?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/8443132840747633234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2011/01/prefuse-out-of-memory-error.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/8443132840747633234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/8443132840747633234'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2011/01/prefuse-out-of-memory-error.html' title='Prefuse Out of Memory Error'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-7633441491057632609</id><published>2010-12-16T20:47:00.000-08:00</published><updated>2010-12-26T20:04:23.711-08:00</updated><title type='text'>The largest dimension of a prefuse Display</title><content type='html'>&lt;p&gt;It is an interesting finding to answer the question in the title.&lt;/p&gt;&lt;div&gt;Today, I try put my software to its edge. I create a Display with W=1024 and H=180,000 pixels. Then an OutOfMemeoryException was thrown.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At first, I thought the data is too big to fit in the main memory. So I checked the memory usage, which showed that I didn't reach the maximum memory, and only 60% of the max memory was used. Then I tried to google the origins of the OutOfMemoryException. Some similar links popped up. It turns out to be an issue about the largest size of a BufferedImage that a JVM can located. Here is my findings.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;In Prefuse, Display is the "canvas" allowing a Visualization to paint on. Its source codes show that, a Display uses a BufferedImage to create the Graphics2D for Visualizations.&lt;/li&gt;&lt;li&gt;So how large can a BufferedImage be? A BufferedImage is a combination of a 2D int array, which indicate the X-Y coordination, and a 1D of colors, which indicate the color in each X-Y pixels. Therefore, &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;   the size of a BufferedImage = int[][] * a color&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Theoretically, the largest size of an int[][] = the largest size of an int[], which Max2D array = Max1D array = 2^32B in JAVA. An integer will take 32 bits = 4 Bytes.&lt;/li&gt;&lt;li&gt;A color in Java2D is a 32 bits number, with each Byte represent 0-255, for RGB color and a an alpha value for transparency. So a color takes 32 bits = 4Bytes;&lt;/li&gt;&lt;/ul&gt;OK, now it is clear, the Max size (Dimension) of a BufferedImage (2^32 Bytes/4)/4Bytes = 2^27 for W*H. If we have width as 1024, the max height = 2^17 = 131072.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;Notices: &lt;/b&gt;the Max2D array could be limited by the VM in your machine and the max memory you located for your application. So the final max dimension of a display could vary from one machine to another machine.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-7633441491057632609?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/7633441491057632609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2010/12/large-dimension-of-prefuse-display.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/7633441491057632609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/7633441491057632609'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2010/12/large-dimension-of-prefuse-display.html' title='The largest dimension of a prefuse Display'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-3047577705745787911</id><published>2010-10-04T13:27:00.000-07:00</published><updated>2010-10-04T13:37:48.994-07:00</updated><title type='text'>Working process of actions and renderers</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_J4zh9Yz5L6o/TKo59FhP3xI/AAAAAAAAAQM/J63OctxroMI/s1600/action-renderer-methods.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 122px;" src="http://4.bp.blogspot.com/_J4zh9Yz5L6o/TKo59FhP3xI/AAAAAAAAAQM/J63OctxroMI/s400/action-renderer-methods.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5524291614539767570" /&gt;&lt;/a&gt;&lt;br /&gt;Recently a prefuse user want to do some custom work. One of the tasks is to decide which items need to be shown. So I checked the TreeView demo writen by Heer.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There is a action, called fisheyefilter, which determines how many layers a tree structure will show from the node whose DOI is 0. Then I checked its source codes and finally figure out what the functions of the columns (_visible, _visible:start, _visible:end) in a VisualItem are. Here are some findings.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="language:en-US;margin-top:0pt;margin-bottom:0pt;margin-left:0in; text-align:left;direction:ltr;unicode-bidi:embed;mso-line-break-override:none; word-break:normal;punctuation-wrap:hanging"&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;FishEyeTreeFilter class is one of the actions, determining the value of “_visible; _visible: start; _visible: end”&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="language:en-US;margin-top:0pt;margin-bottom:0pt;margin-left:0in; text-align:left;direction:ltr;unicode-bidi:embed;mso-line-break-override:none; word-break:normal;punctuation-wrap:hanging"&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Renderers will check the _visible value (true or false) of a &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;VisualItem&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; to decide if they need to paint this &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;VisualItem&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="language:en-US;margin-top:0pt;margin-bottom:0pt;margin-left:0in; text-align:left;direction:ltr;unicode-bidi:embed;mso-line-break-override:none; word-break:normal;punctuation-wrap:hanging"&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;If need to paint it, the &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;VisualItem&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; will need to find actions that quantify its position, shape, colors, and orientation.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="language:en-US;margin-top:0pt;margin-bottom:0pt;margin-left:0in; text-align:left;direction:ltr;unicode-bidi:embed;mso-line-break-override:none; word-break:normal;punctuation-wrap:hanging"&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="language:en-US;margin-top:0pt;margin-bottom:0pt;margin-left:0in; text-align:left;direction:ltr;unicode-bidi:embed;mso-line-break-override:none; word-break:normal;punctuation-wrap:hanging"&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Renderers normally has to implement the render() method. And render() method will usually call GraphicsLib.paint() method to finally paint the item.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="language:en-US;margin-top:0pt;margin-bottom:0pt;margin-left:0in; text-align:left;direction:ltr;unicode-bidi:embed;mso-line-break-override:none; word-break:normal;punctuation-wrap:hanging"&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="language:en-US;margin-top:0pt;margin-bottom:0pt;margin-left:0in; text-align:left;direction:ltr;unicode-bidi:embed;mso-line-break-override:none; word-break:normal;punctuation-wrap:hanging"&gt;&lt;span style="font-family: Calibri; color: black; "&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Summary&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="language:en-US;margin-top:0pt;margin-bottom:0pt;margin-left:0in; text-align:left;direction:ltr;unicode-bidi:embed;mso-line-break-override:none; word-break:normal;punctuation-wrap:hanging"&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri; font-size: medium; "&gt;If you want to customize your visualization, work closely with actions and renders. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;Override render() method carefully, and alway try to use GraphicsLib.paint() method if this can work for you.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;If the GraphicsLib.paint() method cannot work, create your own paint() method and use it in the render() method.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-3047577705745787911?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/3047577705745787911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2010/10/working-process-of-actions-and.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/3047577705745787911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/3047577705745787911'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2010/10/working-process-of-actions-and.html' title='Working process of actions and renderers'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_J4zh9Yz5L6o/TKo59FhP3xI/AAAAAAAAAQM/J63OctxroMI/s72-c/action-renderer-methods.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-1051238674487606474</id><published>2010-08-19T17:34:00.000-07:00</published><updated>2010-08-19T17:49:40.414-07:00</updated><title type='text'>Relation between actions and renderers</title><content type='html'>It is unclear what the relation between actions and renderers. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;According to Heer's explanations, actions are supposed to assign visual values to a group of VisualItems, such as colors, shapes, positions, sizes, and etc. BUT the final appearance of an item should be rendered by renderers some of which will decide sizes, and shapes.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This relation could work fine if the position or size of an VisualItem have been pre-set. However, some problem will occur, e.g.  the size of an item is change according to the rendering area, or the position of an item were decided by other items. In these cases, an action should tell its renderer an absolute value of size. The duty of renderers shift to actions. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-1051238674487606474?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/1051238674487606474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2010/08/relation-between-actions-and-renderers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/1051238674487606474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/1051238674487606474'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2010/08/relation-between-actions-and-renderers.html' title='Relation between actions and renderers'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-8702210545169895328</id><published>2010-08-17T08:14:00.000-07:00</published><updated>2010-08-17T08:27:42.974-07:00</updated><title type='text'>Find a VisualItem directly</title><content type='html'>&lt;div&gt;In order to find a VisualItem in prefuse Visualization, there are two ways.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#1 The general way is to get an Iterator by calling Visualization class' item(), getGroup(), or other methods, which will return an Iterator. Then in a while loop, query this Iterator one by one and search for the VisualItem with certain contents.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;        Iterator i= v.items(SOURCE);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;        VisualItem vitem, v1=null, v2=null;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;        while(i.hasNext()){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;            vitem=(VisualItem) i.next();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;            if (vitem instanceof VisualItem){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;                if (vitem.getInt("ID")==s){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;                    v1=vitem;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;                }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;                if (vitem.getInt("ID")==t){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;                    v2=vitem;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;                }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;            }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;#2 A specific way is to cast the TupleSet into a VisualTable if your back up data is a Table. So in this way, the VisualItem can be directly queried by using the row number.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;VisualTable ts=(VisualTable) v.getGroup(SOURCE);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;VisualItem v1=ts.getItem(s-1);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;VisualItem v2=ts.getItem(t-1);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The speed of #2 is much fast than #1. Using this solution, it is easy to handle ~10000 nodes and lines. &lt;/div&gt;&lt;div&gt;But #1 is safe, since if your backup data is not a Table, there may be an exception of casting TupleSet into VisualTable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If your data nodes is small, ~1000, #1 solution would be safe to use. If you want speed, use #2 with careful data design. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-8702210545169895328?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/8702210545169895328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2010/08/find-visualitem-directly.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/8702210545169895328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/8702210545169895328'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2010/08/find-visualitem-directly.html' title='Find a VisualItem directly'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-90117564375237638</id><published>2010-08-13T10:31:00.001-07:00</published><updated>2010-08-15T13:27:01.160-07:00</updated><title type='text'>Design your own actions and renderers</title><content type='html'>&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Prefuse offers a set of actions and renderers to create nice and neat visualization applications.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Based on three weeks digging into the source codes of prefuse and trail-and-fail in a tabluer data demo, my understanding of part of the Actions and Renderers are related blow:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;    The basic logic is to use actions to assign visual features, such as colors, shapes, sizes, and position. And use renderers to finally paint these visual units with above features. &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;In terms of &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;colorAction&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;, &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;dataColorAction&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;,&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt; the key component is the "&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#CC0000;"&gt;process&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;" method, which assign the visual features to a &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;VisualItem&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;    &lt;/span&gt;In &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;shapeRenderer&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt; class, the key component is the "&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#CC0000;"&gt;getShape&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;" method and "&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#CC0000;"&gt;render&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;" method. Particularly, the &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;"&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#CC0000;"&gt;render&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;" method that initialize the final painting of a &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;VisualItem. &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;In general &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;"&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#CC0000;"&gt;render&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;" method will call &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;PrefuseLib&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;'s &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;"&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#CC0000;"&gt;paint&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;" method to do the painting.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 0); font-weight: normal;  font-size:16px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;Therefore, if the prefuse's default actions cannot help your customized application, it is necessary to write customized actions and renders. Here are one example for my work.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;Design idea: &lt;/span&gt;&lt;/span&gt;&lt;u&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;draw a visualitem with a sequence of color-coded rectangles whose width is also customized&lt;/span&gt;&lt;/span&gt;&lt;/u&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;. See the image.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style=" ;font-size:16px;"&gt;&lt;a href="http://1.bp.blogspot.com/_J4zh9Yz5L6o/TGWMeXYw-CI/AAAAAAAAAPs/sR3C9mx3dJc/s1600/colored+bars.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_J4zh9Yz5L6o/TGWMeXYw-CI/AAAAAAAAAPs/sR3C9mx3dJc/s400/colored+bars.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5504960572832151586" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 23px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;In prefuse's default setting, one visualitem only has one color and one shape assigned with it (seen in the previous post). To my best knowledge, default color and shape actions cannot fulfill my design idea because my design require one visualitem to have multiple colors and shapes.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 0); font-weight: normal;  font-size:16px;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 0); font-weight: normal;  font-size:16px;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;In order to achieve my design idea, I have to add a column into the data table, named length, which will store an integer array for lengths of these rectangles. Also to give the rectangles different colors, I need to add another column, named colors, which is used to store an integer array assigned to each rectangle.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 0); font-weight: normal;  font-size:16px;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 0); font-weight: normal;  font-size:16px;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;The default colorAction and shapeAction process each VisualItem with its colors and shape. Therefore I need to write my own coloraction and renderer to deal with the arrays.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 0); font-weight: normal;  font-size:16px;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 0); font-weight: normal;  font-size:16px;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;For my own coloraction, I create a class, named CompositedColorAction, which extends EncoderAction. And override its&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 0); font-weight: normal;  font-size:16px;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;    public void &lt;b&gt;&lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;process&lt;/span&gt;&lt;/b&gt;(VisualItem vi, double frac)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 0); font-weight: normal;  font-size:16px;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;method. Here are the method codes:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:small;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 0); font-weight: normal;  font-size:16px;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;    @Override&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;    public void process(VisualItem vi, double d) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        List l=getTypeList(vi);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        ArrayList colors=new ArrayList();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        for (int i=0;i&lt;l.size();i++){&gt;&lt;/l.size();i++){&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;            if (l.get(i) instanceof Integer){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;                colors.add(m_palette[(Integer) l.get(i)]);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;            }else throw new IllegalArgumentException(&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;                    "Unrecognized data type");&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        vi.set(m_colorListField, colors);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In these codes add an array of colors to the column "color" in a visual item for render to use.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To render multiple rectangles, I write a CompositedShapeRenderer class, which extends ShapeRender, and override its &lt;/div&gt;&lt;div&gt;    public void &lt;span class="Apple-style-span"  style="color:#33CC00;"&gt;Render&lt;/span&gt;(Graphics2D g, VisualItem vi) &lt;/div&gt;&lt;div&gt;method.&lt;/div&gt;&lt;div&gt;Here are the source codes.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;    @Override&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;    public void render(Graphics2D g, VisualItem vi){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        Shape[] shapes=getRawShapes(vi);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        int[] colors=getRawColors(vi);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        if (shapes!=null){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;            GraphicsLibPlus.compositedPaint(g, vi, shapes, colors, vi.getStroke(), getRenderType(vi));&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Here the getRawShapes() and getRawColors() method is as below:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;    protected Shape[] getRawShapes(VisualItem vi) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        // a temp shape array to store all rectganles&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        Shape[] tempShapes=null;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:16px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 0); font-weight: normal;  font-size:16px;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;div style="display: inline !important; "&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        // create shapes&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        double x=vi.getX();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        double y=vi.getY();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        if ( Double.isNaN(x) || Double.isInfinite(x) )&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;            x = 0;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        if ( Double.isNaN(y) || Double.isInfinite(y) )&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;            y = 0;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        ArrayList sizes=(ArrayList) vi.get(m_type);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        tempShapes=new Shape[sizes.size()];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        for (int i=0;i&lt;sizes.size();i++){&gt;&lt;/sizes.size();i++){&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;            m_shape=new RoundRectangle2D.Double();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;            m_shape.setRoundRect(x, y, (Integer)sizes.get(i)*m_baseSize,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;                    m_baseSize, m_arcWidth, m_arcHeight);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;            tempShapes[i]=m_shape;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;            x=x+(Integer)sizes.get(i)*m_baseSize;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        return tempShapes;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style=" ;font-size:16px;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color: rgb(0, 0, 0); font-weight: normal;  font-size:16px;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;div style="display: inline !important; "&gt;&lt;div style="display: inline !important; "&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;    protected int[] getRawColors(VisualItem vi){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        int[]   tempColors=null;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        ArrayList colors=(ArrayList) vi.get(m_colors);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        tempColors=new int[colors.size()];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        for (int i=0;i&lt;colors.size();i++){&gt;&lt;/colors.size();i++){&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;            tempColors[i]=(Integer) colors.get(i);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;        return tempColors;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="color:#999999;"&gt;    }   //end of getRawColors method&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;The two methods read the colors and widths from the visual item's "types" and "colors" columns and ask the paint method to render the rectangles with different colors.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here the render method use a new painting method, called&lt;/div&gt;&lt;div&gt;   GraphicsLibPlus.compositedpait.nnt()&lt;/div&gt;&lt;div&gt;I rewrite this method from prefuse' original painting method, called GraphicsLib.paint(). Because the original method only paint one shape, I have create a new painting method.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Summary:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;In order to design your own visualization, you need to do a lot on actions and renderers. Usually you specify some new columns in a data tuple (a data row), and use actions to change values of these columns, and ask renderers to paint this visual item by looking at these rows and paint accordingly. If the original GraphicsLib.paint() method does not work, you need to write a new class and new paint() method for your purposes.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;Welcome to add comments and ask questions from my site (see upper left conner of this page).&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;b&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-90117564375237638?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/90117564375237638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2010/08/design-your-own-actions-and-renderers.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/90117564375237638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/90117564375237638'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2010/08/design-your-own-actions-and-renderers.html' title='Design your own actions and renderers'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_J4zh9Yz5L6o/TGWMeXYw-CI/AAAAAAAAAPs/sR3C9mx3dJc/s72-c/colored+bars.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-2007673678152406612</id><published>2010-08-12T10:52:00.000-07:00</published><updated>2010-08-12T13:43:08.344-07:00</updated><title type='text'>The structure of a VisulItem</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;VisulItem is the basic unit for prefuse' renderers to deal with. Also it extends a row in a data table, adding many columns into the row with many features associated with visual representation.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For a simple data table like this: Test Table&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;protected final Schema tableschema=new Schema();&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;    {&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;        tableschema.addColumn(ID, int.class);&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;        tableschema.addColumn(SIMscore, float.class);&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;        tableschema.addColumn(LINES, float.class);&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:georgia;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;i&gt;    }&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The table schema is same as above.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Schema[(ID, int, -1) (score, float, 0.0) (lines, float, 0.0)]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;When this table is associated with a Visualization, a VisualTable is created and the schema of this table is:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Schema[(_validated, boolean, false) (_visible, boolean, true) (_visible:start, boolean, false) (_visible:end, boolean, true) (_interactive, boolean, true) (_expanded, boolean, true) (_fixed, boolean, false) (_highlight, boolean, false) (_hover, boolean, false) (_x, double, 0.0) (_x:start, double, 0.0) (_x:end, double, 0.0) (_y, double, 0.0) (_y:start, double, 0.0) (_y:end, double, 0.0) (_bounds, java.awt.geom.Rectangle2D, java.awt.geom.Rectangle2D$Double[x=0.0,y=0.0,w=0.0,h=0.0]) (_strokeColor, int, 0) (_strokeColor:start, int, 0) (_strokeColor:end, int, 0) (_fillColor, int, 0) (_fillColor:start, int, 0) (_fillColor:end, int, 0) (_textColor, int, 0) (_textColor:start, int, 0) (_textColor:end, int, 0) (_size, double, 1.0) (_size:start, double, 1.0) (_size:end, double, 1.0) (_shape, int, 0) (_stroke, java.awt.Stroke, java.awt.BasicStroke@d1a0003e) (_font, java.awt.Font, java.awt.Font[family=SansSerif,name=SansSerif,style=plain,size=10]) (_font:start, java.awt.Font, java.awt.Font[family=SansSerif,name=SansSerif,style=plain,size=10]) (_font:end, java.awt.Font, java.awt.Font[family=SansSerif,name=SansSerif,style=plain,size=10]) (_doi, double, 4.9E-324) (ID, int, -1) (score, float, 0.0) (lines, float, 0.0)]&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_J4zh9Yz5L6o/TGRcndPyz9I/AAAAAAAAAPk/YuEAccMdSAQ/s1600/Schema+of+VisualItem.png"&gt;&lt;img src="http://2.bp.blogspot.com/_J4zh9Yz5L6o/TGRcndPyz9I/AAAAAAAAAPk/YuEAccMdSAQ/s400/Schema+of+VisualItem.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5504626477489115090" style="float: left; margin-top: 0px; margin-right: 10px; margin-bottom: 10px; margin-left: 0px; cursor: pointer; width: 259px; height: 400px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;See the image for clarity.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So now the structure of a VisualItem is clear. Besides the basic three data columns, a set of features are added in, which helps to set up the &lt;i&gt;size&lt;/i&gt;, &lt;i&gt;position&lt;/i&gt;, &lt;i&gt;color&lt;/i&gt;, &lt;i&gt;shape&lt;/i&gt;, &lt;i&gt;bound&lt;/i&gt;, and etc. And these features can be changed when various EncodingActions are called. For example, &lt;u&gt;ColorAction&lt;/u&gt; assigns the color of this item, which is the ROW!!!!!!! (remember? each visualitem represents a row in the table. So one row, one item, and one visual unit in a Visualization). &lt;u&gt;ShapeAction&lt;/u&gt; assigns the shape of an item. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Each visual item has its position information, normally assigned by Layout actions, such as &lt;u&gt;AxisLayout&lt;/u&gt;, and  &lt;u&gt;CircleLayout&lt;/u&gt;. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eventually various Renderers will paint a visual item based on its features that stored in its corresponding columns. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;TMHK, Renderers will use PrefuseLib.paint(graphic g, visualitem item) method to do the painting.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In next post, I tried to explain how the Actions and Renderers work, as these two classes need to collaborate to paint a visual item in the right place, with right color and shape.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-2007673678152406612?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/2007673678152406612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2010/08/structure-of-visulitem.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/2007673678152406612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/2007673678152406612'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2010/08/structure-of-visulitem.html' title='The structure of a VisulItem'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_J4zh9Yz5L6o/TGRcndPyz9I/AAAAAAAAAPk/YuEAccMdSAQ/s72-c/Schema+of+VisualItem.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-5159491845959749532</id><published>2010-08-05T13:18:00.000-07:00</published><updated>2010-08-05T13:24:13.768-07:00</updated><title type='text'>Learning prefuse, a hard start, but progress made</title><content type='html'>As many commented, it is a hard start to learn prefuse toolkit. But once dig into the source codes and demos, a good progress has been made.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Have to say Jeff is definitely a genius. Just learn the codes may cause me one year or more, but he finish writing such codes as his master thesis work. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After trial-and-fail for three weeks, now the structure is clear. Will keep posting to help others.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-5159491845959749532?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/5159491845959749532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2010/08/learning-prefuse-hard-start-but.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/5159491845959749532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/5159491845959749532'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2010/08/learning-prefuse-hard-start-but.html' title='Learning prefuse, a hard start, but progress made'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-1017661135150329310</id><published>2010-05-09T11:34:00.000-07:00</published><updated>2010-08-05T13:17:38.774-07:00</updated><title type='text'>one month for a poster to Infoviz 2010.</title><content type='html'>one month for a poster to Infoviz 2010.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Eventually the poster got accepted. It is a go now.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-1017661135150329310?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/1017661135150329310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2010/05/one-month-for-poster-to-infoviz-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/1017661135150329310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/1017661135150329310'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2010/05/one-month-for-poster-to-infoviz-2010.html' title='one month for a poster to Infoviz 2010.'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-1776973476533581129</id><published>2009-07-30T08:34:00.000-07:00</published><updated>2009-07-30T13:13:24.578-07:00</updated><title type='text'>HCII 2009 San Diego</title><content type='html'>&lt;div&gt;&lt;br /&gt;Dr. Ed Chi gave a very interesting and inspiral talk in the HCII 2009 at San Diego, titled as "Living laboratories: Rethinking Ecological Designs and Experimentation in Human Computer Interaction".&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I knew Dr. Chi first from his paper of the &lt;b&gt;data state reference model&lt;/b&gt; taxonomy for infovis, which is his thesis study. This taxonomy has inspired many research and formed guidelines for design infovis tool, such as prefuse toolkit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In Dr. Chi's presentation, he post a table, which contains four different HCI laboraty scenarios, depending on 1) whether the system under control, and 2) where the evaluation is located, in lab or in the wild. See the figure 1.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_J4zh9Yz5L6o/SnH-orghDeI/AAAAAAAAAAM/wkQwAkWbG5Q/s1600-h/Chi+Table.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 177px;" src="http://3.bp.blogspot.com/_J4zh9Yz5L6o/SnH-orghDeI/AAAAAAAAAAM/wkQwAkWbG5Q/s400/Chi+Table.PNG" border="0" alt="" id="BLOGGER_PHOTO_ID_5364348606002302434" /&gt;&lt;/a&gt;&lt;div style="text-align: center;"&gt;Figure 1 The four evaluation scenarios in HCI testing&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-1776973476533581129?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/1776973476533581129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2009/07/hcii-2009-san-diego.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/1776973476533581129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/1776973476533581129'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2009/07/hcii-2009-san-diego.html' title='HCII 2009 San Diego'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_J4zh9Yz5L6o/SnH-orghDeI/AAAAAAAAAAM/wkQwAkWbG5Q/s72-c/Chi+Table.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-3819415906611218400</id><published>2009-06-11T20:19:00.001-07:00</published><updated>2009-06-11T20:42:32.961-07:00</updated><title type='text'>Two things in JAVA programming</title><content type='html'>&lt;div&gt;Recently I found two interesting things in JAVA programming. Each of them took me several hours to figure out why. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;1. What are instances of an object in JAVA?&lt;div&gt;    It is just an address. Any operations actually affect the contents of the object.&lt;/div&gt;&lt;div&gt;    For example, &lt;/div&gt;&lt;div&gt;    Object O=new Object();&lt;/div&gt;&lt;div&gt;    O=(Object) linkedlist.get(&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;i&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;    O.content1++;&lt;/div&gt;&lt;div&gt;    Althoug the object O is a new instance, it has only been cast an memory address of the object &lt;i&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;i&lt;/span&gt;&lt;/i&gt; in the LinkedList.&lt;/div&gt;&lt;div&gt;    So the content of the object &lt;i&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;i&lt;/span&gt;&lt;/i&gt; in the LinkedList has been CHANGED!!! Future operation will have a different LinkedList.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. How to sort a collection like LinkedList that store any kinds of objects?&lt;/div&gt;&lt;div&gt;     I have tried to write a class to solve this problem, since sort would be fundation of many further operations or algrithms like quick search. Later I realized that JAVA standard class has already have a function to do this. An interface called Comparator can tell the how to compare the objects in a collection. So the only thing needed to do is implemented the Comparator with my own way.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-3819415906611218400?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/3819415906611218400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2009/06/two-things-in-java-programming.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/3819415906611218400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/3819415906611218400'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2009/06/two-things-in-java-programming.html' title='Two things in JAVA programming'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-2837511642985069877</id><published>2009-05-03T16:45:00.000-07:00</published><updated>2009-05-03T17:12:02.549-07:00</updated><title type='text'>Thinking in Java 3rd</title><content type='html'>This week's book reading include 6-8 chapters of &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Thinking in Java&lt;/span&gt; 3rd version in Chinese translation. These three sections highlight "&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;Reusing&lt;/span&gt; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;Classes&lt;/span&gt;," "Polymorphism," and "Interfaces &amp;amp; Inner Classes," which form the key core of JAVA language.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Friday night, I talked with my friend who is working as the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;EIC&lt;/span&gt; of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;O'Reilly&lt;/span&gt; China.  We all agree that in current days &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;fast-food&lt;/span&gt; IT books will soon, or already, be out of market &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;because&lt;/span&gt; readers, like me, can easily get answer and learn basic skills of popular programming languages like JAVA, C++, or Python, from the WWW. Once readers have questions, they might directly go to Google and can get numerous answers and examples. Publishing such kinds of fast-food books can hardly have profits. All publishers should think about this problems, especially in China. In China, the four major IT publishers profits a lot from publishing such fast-food books, such as &lt;span class="Apple-style-span" style="font-style: italic;"&gt;24 hours to learn Windows XP. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Today, when not profits can be owned from these books, what books can be the source of their revenue? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now, I think, publishers should look for authors like Buckle and publish such book as &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Thinking in Java&lt;/span&gt;. This is NOT a book for fresh fish, like six-month-ago me. However, contents in this book answer a lot of questions, which were posted everywhere in the WWW, but few people can answer them correctly. If readers want to be an advanced JAVA programmer, they should read the book from the first page to the end. And buy a hard copy and put on place where hands can easily touch. AND Re-Read it whenever they have time. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Such kinds of books will be sold well and publishers will profit.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-2837511642985069877?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/2837511642985069877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2009/05/thinking-in-java-3rd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/2837511642985069877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/2837511642985069877'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2009/05/thinking-in-java-3rd.html' title='Thinking in Java 3rd'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-3211084103592302593</id><published>2009-05-01T10:22:00.000-07:00</published><updated>2009-05-01T11:41:55.035-07:00</updated><title type='text'>Connecting literature with objects</title><content type='html'>For finding who is indexing the scientific objects for &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;literature&lt;/span&gt;, I conducted a random search. Here are some preliminary results.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;        &lt;a href="http://adswww.harvard.edu/"&gt;NASA ADS&lt;/a&gt; did the  closest work for indexing the astronomical objects from literature and explicitly associating literature with objects in its content page.&lt;/div&gt;&lt;div&gt;        &lt;a href="http://www.ncbi.nlm.nih.gov/pubmed/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;PubMed&lt;/span&gt;&lt;/a&gt; integrate several databases, including genome and protein databases. Users can search genetic names in the literature search. However, no explicit link exist to connect literature with genomes or proteins.&lt;/div&gt;&lt;div&gt;        The &lt;a href="http://www.informatics.jax.org/searches/gxdindex_form.shtml"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;MGI's&lt;/span&gt; Gene Expression Literature&lt;/a&gt; database, which is hosted by the Jackson &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_3"&gt;Laboratory, has an interesting search function, which indexes literature in their database with genetic experssion. Hence each biblio-record has a link refering to genetic object.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So far, I didn't find clear statement about how they indexing this objects. But it seems that specific databases do start to index scientific objects to literature and build up the connection for research.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-3211084103592302593?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/3211084103592302593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2009/05/connecting-literature-with-objects.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/3211084103592302593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/3211084103592302593'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2009/05/connecting-literature-with-objects.html' title='Connecting literature with objects'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-2870318005121620852</id><published>2009-04-26T12:38:00.000-07:00</published><updated>2009-04-26T16:24:21.556-07:00</updated><title type='text'>Digging into Data (Cont)</title><content type='html'>In the Digging into Data homepage, there are several interesting readings. Here I would like to share my thinking of the one from &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Wired&lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt; Magazine&lt;/span&gt;:&lt;span class="Apple-style-span" style="font-style: italic;"&gt; &lt;a href="http://www.wired.com/science/discoveries/magazine/16-07/pb_theory"&gt;The End of Theory: The Data Deluge Makes Scientific Method Obsolete&lt;/a&gt;&lt;/span&gt;,  by Chris Anderson, EIC of &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Wired. &lt;/span&gt;This article triggers 76 comments, which list a various thoughts of the idea. This article, along with the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;The Unreasonable Effectiveness of Data,&lt;/span&gt; promotes the Google's approach. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;Chris is very optimistic about the "new" approach that leverage the power of huge amount of data since, as in the &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Unreasonable&lt;/span&gt; said, for many tasks, the millions or so examples might represent the whole picture of the world. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;By reading the comments, I realized that, maybe it is time to think what tasks can leverage the power of data, and let the data speaks itself. One comments try to challenge the approach by "nuclear fusion;" another thought some disciplines, like physics, still stand upon neat theories and models, while other disciplines, like biology, economics, where models come and go, could benefit more from data deluge than others.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;Going back to my own questions, what are those tasks? It seems to me that the data generated by human beings themselves such as languages and behaviours might be able to speak themselves, meanwhile data generated from the nature--earth, sky, universe-- (of course, they are measured and sensored by human beings, but not of ourselves) might need to be spoken by real experiments and observations. As one comment said, the models discovered by J. Craig Venter are not discoveries until these models are confirmed with things found in real world. Therefore models from ourselves could be relatively easily validated than models from natural data, like in high energy physics, where very few data will come out until new accelerators are built.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-2870318005121620852?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/2870318005121620852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/digging-into-data-cont.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/2870318005121620852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/2870318005121620852'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/digging-into-data-cont.html' title='Digging into Data (Cont)'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-5121295864810025086</id><published>2009-04-25T18:37:00.000-07:00</published><updated>2009-04-25T21:07:57.172-07:00</updated><title type='text'>Digging into Data</title><content type='html'>&lt;a href="http://www.diggingintodata.org/"&gt;Digging into Data Challenge&lt;/a&gt; is an initiative grant competition sponsored by JISC, NEH, NSF, and SSHRC to answer "how does the notion of scale affect humanities and social science reserch?"or how the huge repositories of digitized data mean for research.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I read two of the related readings. &lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;a href="http://www.dlib.org/dlib/march06/crane/03crane.html"&gt;What do you do with a million books?&lt;/a&gt;&lt;/span&gt; by Gregory Crane and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;a href="http://www.computer.org/portal/cms_docs_intelligent/intelligent/homepage/2009/x2exp.pdf"&gt;The Unreasonable effectiveness of data&lt;/a&gt;&lt;/span&gt; by Alon Halevy, Peter norvig, and Fernando Pereira. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first paper discussed the changes that digital libraries may confront in terms of the digitized trends of contents. The discussion of this paper focused on scalability issuse, and how this feature introduces new research topics for domain specialists interacting with huge collections. Authors considered that "document analysis, multilingual technology, and information extraction can be modeled in general terms, but these technologies acquire meaning when they are aligned with the needs of particualr domains." &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;This paper discussed the scalability issue from a classic digital library perspective, seeing several large scale digitization initiatives such as Google Library, Making of America, Open Content Alliance, and etc. and their impacts to digital libraries. Integrating the huge digitized collections with specific domains could dig out rich and meaningful contents for research, which traditional printed contents can hardly achieve.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;The second paper, in my mind, extends the audiancs or users of large digitized collections from researchers to broader ranges. &lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;The second paper view the whole WWW as the largest digitized collections and a rich sementic sourse for unsupervised learning. The authors argued that instead of trying to create neat theories for natural language processing, researchers might turn to use the best ally: the unreasonable effecitiveness of data, because "for many tasks, once we have a billion or so examples, we essentially have a closed set that represents (or at least approximates) what we need, without genrative rules." Hence for Sementic Interpratation--the problem of understanding human speech and writing--could be done by "learning as much as possible about the context of content to correctly disambiguate it." &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;This study may reveal the bright side of Data Deluge--the quickly increased data could serve as valuable data source for some tasks, which require large training data sets that are previously harder to get, such as paralle multiligual corpura. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;When facing such huge digitized collections, I would ask whether researchers who want to take advantage of such collections must become the experts of computing, who can handle such large volumes of data. Also what is the role of Visualization in the whole process of using the effectiveness of data?&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-5121295864810025086?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/5121295864810025086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/digging-into-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/5121295864810025086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/5121295864810025086'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/digging-into-data.html' title='Digging into Data'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-4862124284474053663</id><published>2009-04-18T18:49:00.000-07:00</published><updated>2009-04-18T19:46:52.318-07:00</updated><title type='text'>Robert Spence's InfoVis</title><content type='html'>This week's book reading is &lt;a href="http://www.ee.ic.ac.uk/r.spence/"&gt;Robert Spence&lt;/a&gt;'s InfoVis 2001 (&lt;a href="http://www.amazon.com/Information-Visualization-Robert-Spence/dp/0201596261"&gt;Amazon link&lt;/a&gt;).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Different from the other two classic InfoVis books, &lt;span class="Apple-style-span" style="font-style: italic;"&gt;The Craft of InfoVis&lt;/span&gt;, by Bederson and Shneiderman, and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;InfoVis Using Vision to Think&lt;/span&gt;, by Card, Mackinlay, and Shneiderman, both of which consist of multiple research papers, &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;the Spence's InfoVis book could be a nice text book for InfoVis 101 in my idea.&lt;/span&gt; As a colorly printed book, having around 190 pages, this work introduces nearly all fundamental perspectives of InfoVis, and easy to read in a week. &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0); "&gt;Terminology in this book is slightly different from those in papers I read recently, such as using Rearrangement as the same level with Interaction, using Univariate, Bivariate,..., to talk about 1D, 2D, 3D, and multi-D data.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Spence emphasizes that Visualization is a &lt;span class="Apple-style-span" style="font-style: italic;"&gt;cognitive activity&lt;/span&gt; and therefore, "The potential value of visualization--that  of gaining INSIGHT and UNDERSTANDING--follows from these definitions but also, in view of the coginitive nature of visualization does the difficulty of its study" (p. 1) &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;This emphasis of cognitive perspective forms the major strength of this book&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I skimed several chapters, which relate the general ideas of InfoVis. And put my main efforts on scrutinizing chapter 6 where Spence introduced a "Nevigation Model" to construct a loop that consists of Internal Models, their Formation, and Interpretation.  Spence considered that the Navigation is of such importance to infovis, and includes the major concepts relevant to infovis, like Internal Models and their characteristics, how models form in our mind, how people interpretate externalizaiton of data, how we the browsing stragegy forms, &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As this kind of cognitive theorise are relatively "old" compared with the Distributed Cognitiontheories, which are recently introduced to the InfoVis community by &lt;a href="http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=4658127"&gt;Liu (2008)&lt;/a&gt;. It would be very interesting to read the Liu's paper again so that new insights may come out.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-4862124284474053663?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/4862124284474053663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/robert-spences-infovis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/4862124284474053663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/4862124284474053663'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/robert-spences-infovis.html' title='Robert Spence&apos;s InfoVis'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-1393083470723225916</id><published>2009-04-17T08:55:00.000-07:00</published><updated>2009-04-17T09:50:36.183-07:00</updated><title type='text'>Related Sites: InfoVis Wiki</title><content type='html'>I found this site (&lt;a href="http://www.infovis-wiki.net/index.php?title=Main_Page"&gt;InfoVis Wiki&lt;/a&gt;) about one month ago. A good wiki portal of InfoVis, having a lot of info. Do hope it is updated frequently.&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(85, 26, 139); text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-1393083470723225916?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/1393083470723225916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/related-sites-infovis-wiki.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/1393083470723225916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/1393083470723225916'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/related-sites-infovis-wiki.html' title='Related Sites: InfoVis Wiki'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-7203166701876288734</id><published>2009-04-14T12:48:00.000-07:00</published><updated>2009-04-14T13:02:28.055-07:00</updated><title type='text'>Insight-based Evaluation of Vis</title><content type='html'>&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;(Plaisant, Fekete, Grinstein, 2008) Promoting Insight-Based Evaluation of Visualizations: From Contest to Benchmark Reporsitory. &lt;/span&gt;(&lt;a href="http://portal.acm.org/citation.cfm?id=1320860"&gt;Link&lt;/a&gt; from ACM portal, &lt;a href="http://hcil.cs.umd.edu/trs/2004-30/2004-30.pdf"&gt;link&lt;/a&gt; from authors)&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Great summary and reflections of InfoVis Contest 03-05. &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;I hope I could read this paper before I drafted my submission to infovis09 since I could get more insights of the 04 contest data and made my argument stronger by comparing my findings with the insights discovered and evaluated by the judgers&lt;/span&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-7203166701876288734?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/7203166701876288734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/insight-based-evaluation-of-vis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/7203166701876288734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/7203166701876288734'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/insight-based-evaluation-of-vis.html' title='Insight-based Evaluation of Vis'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-7353928286668810851</id><published>2009-04-14T12:27:00.000-07:00</published><updated>2009-04-14T13:02:42.206-07:00</updated><title type='text'>Redefine Visual Analytics</title><content type='html'>&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Keim, Andrienko, Fekete, Gorg, Kohlhammer, and Melancon, (2008). Visual Analytics: Definition, Process, and Challenges&lt;/span&gt;. (&lt;a href="http://infovis.uni-konstanz.de/papers/2007/Dagstuhl2007VisualAnalyticsfinal.pdf"&gt;pdf&lt;/a&gt; &lt;span class="Apple-style-span" style="font-style: italic;"&gt;link from author&lt;/span&gt;).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;An excellent summary paper, talking about Visual Analytics (VA), introducing the origins of the data overload challenge, describing the questions needed to be answer and the tasks needed to be performanced efficiently and effectively, defining the concept of VA and its goals, differentiating the scientic visual, inforvis, and VA, discussing the related areas (Visualization, Data management, Data analysis, Perception and cognition, HCI, and Infrastructure and evaluation) to VA, bringing a mantra to VA--"Analyze first, Show the Important, Zoom, filter and analyze further, Details on demand," listing Application challenges and Technical challenges, and at the end giving two vivid examples of VA. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-7353928286668810851?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/7353928286668810851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/redefine-visual-analytics.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/7353928286668810851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/7353928286668810851'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/redefine-visual-analytics.html' title='Redefine Visual Analytics'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-3421929535863805095</id><published>2009-04-12T13:05:00.000-07:00</published><updated>2009-04-14T13:02:57.713-07:00</updated><title type='text'>User experiments with five tree visual</title><content type='html'>&lt;span style="line-height:115%; font-family:&amp;quot;Calibri&amp;quot;,&amp;quot;sans-serif&amp;quot;;mso-fareast-font-family:宋体;mso-fareast-theme-font: minor-fareast;mso-bidi-Times New Roman&amp;quot;;mso-bidi-theme-font:minor-bidi; mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SAfont-family:&amp;quot;;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;A. Kobsa, "User Experiments with Tree Visualization Systems,"&lt;/span&gt; in &lt;/span&gt;&lt;i style="mso-bidi-font-style:normal"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;IEEE Symposium on Information Visualization&lt;/span&gt;&lt;/i&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;, Austin, TX USA, 2004. (&lt;a href="http://vis.computer.org/vis2004/DVD/infovis/papers/kobsa.pdf"&gt;Link&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="  line-height: 17px;font-family:Calibri;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="  line-height: 17px;font-family:Calibri;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;An empirical study that compared the 5 infovis systems for tree hierachies with using Windows Explorer as baseline system. The five infovis systems are&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Treemap 3.2&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Sequoia View 1.3&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;BeanTrees&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Star Tree Studio 3.0&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Tree Viewer&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;The tasks in this study included 15 questions that could be divided into two catgories: structure-related tasks and attribute-related tasks.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This study find the baseline--Windows Explorer, works well in terms of task correctness, completion times, and user satisfaction. In the five tested systems, Treemap 3.2 has achieved similar or better performace than Explorer. The other four were overperformanced by Explorer. Bean Trees had relatively the worse performance based on the three evaluation metrics.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The author also used video records of screen shot for further analysis, and gave detailed descriptions of each tested visual system.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Strengthes:&lt;/div&gt;&lt;div&gt;        1. A true emprical studies of usability and usefulness of infovis systems.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;        2. Strong study design, based on both previous study in InfoVis 2003 Contest and their own requiements.&lt;/div&gt;&lt;div&gt;        3. Comprehensive analyses based on quantitative metrics and qualitative analysis.&lt;/div&gt;&lt;div&gt;        4. &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0); "&gt;Interesting results: system 2-5 had poor performance compared with Windows Explorer, which I didn't expected before reaching the results section. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;Weaknesses:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;        As theoretical studies like to view InfoVis in two perspectives: Visual representation and interaction, I at first thought this paper would compare the unique feature of each visual representation of hierarchies in tree structure. The results of this study, however, mixed the two features. It is hard to examine whether the performance of each system comes from the unique visual feature, or the having or lacking of proper interactive features to support the visual representation. I wonder what the different impacts between visual representation of each system and the interactive functions of each system are; or, for each visual representation, what interactive functions can help to improve performance most than other functions.&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0);"&gt; At the end, the author suggested &lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); "&gt;in the conclusion section that further studies might look at the functionality beyond the pure visualization, which could help increase the performance of systems. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-3421929535863805095?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/3421929535863805095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/user-experiments-with-five-tree-visual.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/3421929535863805095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/3421929535863805095'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/user-experiments-with-five-tree-visual.html' title='User experiments with five tree visual'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4252897967377552012.post-300714747923729200</id><published>2009-04-09T20:26:00.000-07:00</published><updated>2009-04-14T13:03:43.963-07:00</updated><title type='text'>insights of Infovis</title><content type='html'>&lt;div&gt;&lt;div&gt;The first one is by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Ji&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Soo&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Yi&lt;/span&gt;, talking about how people gain insights from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;infovis&lt;/span&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;p class="MsoNormal"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;(&lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Yi&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;, &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Kang&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;et&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;al&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;. 2008) Understanding and Characterizing Insights: How do people gain insights using information visualization?&lt;/span&gt;&lt;!--[if supportFields]&gt;&lt;span style="'mso-element:field-end'"&gt;&lt;/span&gt;&lt;![endif]--&gt; (&lt;a href="http://portal.acm.org/citation.cfm?id=1377971"&gt;link&lt;/a&gt; from ACM portal&lt;a herf=""&gt;)&lt;/a&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;This paper is a serial papers from &lt;span class="Apple-style-span" style="color: rgb(0, 0, 153);"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Yi&lt;/span&gt;&lt;/span&gt;, which bring lots of insights into the theoretical fundatation of InfoVis at Infovis Conference, BELIV, and his dissertation. &lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;In this paper, authors revealed four procedures through which people gain insights from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;infovis&lt;/span&gt; systems or tools by reviewing &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;pervious&lt;/span&gt; studies on benefits gained from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;infovis&lt;/span&gt;. The four procedures include:&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Provide overview&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Adjust&lt;/li&gt;&lt;li&gt;Detect pattern&lt;/li&gt;&lt;li&gt;Match mental mode&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Before going to the detailed descriptions of the four procedures, authors argued why they &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_13"&gt;endeavour&lt;/span&gt; to find "how" to gain insights, instead of "what" is a insight, because the definition of "insights" are complex, and a uniformed, wildly accepted definition of insights is still lack. Knowing how people gain insights could help to define what insights are.&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Authors also argued that the "insights" are not only the "end results," but the sources or stimuli of other insights, and &lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;often&lt;/span&gt;&lt;/span&gt; a by-product of exploration without an initial destination. &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;This arguments lead me to think about the &lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0); "&gt;&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_16"&gt;mantra at Thomas and Cook's &lt;span class="Apple-style-span" style="font-style: italic;"&gt;Illuminating the Path&lt;/span&gt;&lt;/span&gt;, "detect expected, and discovery &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17" style="background-color: rgb(255, 255, 0); "&gt;un&lt;/span&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18" style="background-color: rgb(255, 255, 0); "&gt;expected.&lt;/span&gt;" Are insights expected or unexpected? &lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); "&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0); "&gt;What are the differences between "insights" and "discover&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(255, 0, 0); "&gt;&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_15"&gt;is&lt;/span&gt;"?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Authors use data/frame theory of sense making as a critical step for understanding insight gaining, because "we found that understanding sense making is critical." &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;I do hope to hear more about the relationship between the two concepts, which may lay down solid foundation of InfoVis and Visual Analytics.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the final conclusion, authors raised an interesting question, "Is there something unique about visualization in the way  it produces insight that is different from other ways of producing insights?" &lt;span class="Apple-style-span" style="color: rgb(255, 0, 0);"&gt;For this question, I would like to think if any of the four processes discussed in above can have this unique feature. Is visualization good at helping match mental model of human beings with the data? &lt;/span&gt;&lt;/div&gt;&lt;a herf=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;a herf=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4252897967377552012-300714747923729200?l=thinking-infovis.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://thinking-infovis.blogspot.com/feeds/300714747923729200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/theories-of-infovis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/300714747923729200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4252897967377552012/posts/default/300714747923729200'/><link rel='alternate' type='text/html' href='http://thinking-infovis.blogspot.com/2009/04/theories-of-infovis.html' title='insights of Infovis'/><author><name>Infovis_thinker</name><uri>http://www.blogger.com/profile/04099705862142270382</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
