"Exploring and Explaining Data with the Processing Environment"から拝借。
画面上をクリックしてアクティブにしてからスペースキーを押すと、円の半径がかわります。
マウスオーバーで州名と値が表示されます。
http://d.hatena.ne.jp/t_yano/20080706/1215370412 を参照。
ProcessingからExport>Appletを選択。appletフォルダが出来る。
これを任意のサーバにアップロード。
次のxmlを準備。archiveには関連する全てのjarをcodebaseからの相対パスで指定し、
codeにはメインのjavaファイルを指定すればOK。
<?xml version="1.0" encoding="UTF-8" ?> <Module> <ModulePrefs title="running dialog applet example" height="50" /> <Content type="html"> <![CDATA[ <applet codebase="http://yoursite.jp/applet/" archive="beansbinding-1.2.1.jar,swing-layout-1.0.3.jar,DialogSample.jar" code="jp.javelindev.sample.ProgressApplet.class" width="100" height="35" ></applet> ]]> </Content> </Module>
appletと同じ場所にアップロードしておく。
このGadget用xmlへのリンクをはてなダイアリーに記述する。
<div class="hatena-widget"> <script src="http://gmodules.com/ig/ifr?url=http://yoursite.jp/applet/yourgadget.xml&synd=open&w=100&h=35&title=&border=%23ffffff%7C0px%2C0px+solid+%23ffffff&output=js"></script> </div>
Processingのソースコードは以下。
mapping.pde
PImage mapImage; Table locationTable; Table nameTable; int rowCount; Table dataTable; float dataMin = -10; float dataMax = 10; Integrator[] interpolators; void setup() { size(640, 400); PFont font = loadFont("Serif-12.vlw"); textFont(font); mapImage = loadImage("map.png"); locationTable = new Table("locations.tsv"); nameTable = new Table("names.tsv"); rowCount = locationTable.getRowCount(); dataTable = new Table("random.tsv"); interpolators = new Integrator[rowCount]; for (int row = 0; row < rowCount; row++) { float initialValue = dataTable.getFloat(row, 1); interpolators[row] = new Integrator(initialValue); } smooth(); noStroke(); } float closestDist; String closestText; float closestTextX; float closestTextY; void draw() { background(255); image(mapImage, 0, 0); for (int row=0;row < rowCount; row++) { interpolators[row].update(); } closestDist = MAX_FLOAT; for (int row = 0;row < rowCount; row++) { String abbrev = dataTable.getRowName(row) ; float x = locationTable.getFloat(row, 1); float y = locationTable.getFloat(row, 2); drawData(x, y, abbrev); } if (closestDist != MAX_FLOAT) { fill(0); textAlign(CENTER); text(closestText, closestTextX, closestTextY); } } void drawData(float x, float y, String abbrev) { int row = dataTable.getRowIndex(abbrev); float value = interpolators[row].value; float radius = 0; if (value > 0) { radius = map(value, 0, dataMax, 1.5, 15); fill(#4422CC); //blue } else { radius = map(value, 0, dataMin, 1.5, 15); fill(#FF4422); //red } ellipseMode(RADIUS); ellipse(x, y, radius, radius); float d = dist(x, y, mouseX, mouseY); if ((d < radius +2) && (d < closestDist)) { closestDist= d; String name = nameTable.getString(abbrev, 1); String val = nfp(interpolators[row].target, 0, 2); closestText = name + " " + val; closestTextX = x; closestTextY = y-radius-4; } } void keyPressed() { if (key == ' ') { updataTable(); } } void updataTable() { for (int row = 0; row < rowCount ; row++) { float newValue = random(-10, 10); interpolators[row].target(newValue); } }
Integrator.pde
class Integrator { final float DAMPING = 0.5f; final float ATTRACTION = 0.2f; float value; float vel; float accel; float force; float mass = 1; float damping = DAMPING; float attraction = ATTRACTION; boolean targeting; float target; Integrator() { } Integrator(float value) { this.value = value; } Integrator(float value, float damping, float attraction) { this.value = value; this.damping = damping; this.attraction = attraction; } void set(float v) { value = v; } void update() { if (targeting) { force += attraction * (target - value); } accel = force / mass; vel = (vel + accel) * damping; value += vel; force = 0; } void target(float t) { targeting = true; target = t; } void noTarget() { targeting = false; } }
Table.pde
class Table { String[][] data; int rowCount; Table() { data = new String[10][10]; } Table(String filename) { String[] rows = loadStrings(filename); data = new String[rows.length][]; for (int i = 0; i < rows.length; i++) { if (trim(rows[i]).length() == 0) { continue; // skip empty rows } if (rows[i].startsWith("#")) { continue; // skip comment lines } // split the row on the tabs String[] pieces = split(rows[i], TAB); // copy to the table array data[rowCount] = pieces; rowCount++; // this could be done in one fell swoop via: //data[rowCount++] = split(rows[i], TAB); } // resize the 'data' array as necessary data = (String[][]) subset(data, 0, rowCount); } int getRowCount() { return rowCount; } // find a row by its name, returns -1 if no row found int getRowIndex(String name) { for (int i = 0; i < rowCount; i++) { if (data[i][0].equals(name)) { return i; } } println("No row named '" + name + "' was found"); return -1; } String getRowName(int row) { return getString(row, 0); } String getString(int rowIndex, int column) { return data[rowIndex][column]; } String getString(String rowName, int column) { return getString(getRowIndex(rowName), column); } int getInt(String rowName, int column) { return parseInt(getString(rowName, column)); } int getInt(int rowIndex, int column) { return parseInt(getString(rowIndex, column)); } float getFloat(String rowName, int column) { return parseFloat(getString(rowName, column)); } float getFloat(int rowIndex, int column) { return parseFloat(getString(rowIndex, column)); } void setRowName(int row, String what) { data[row][0] = what; } void setString(int rowIndex, int column, String what) { data[rowIndex][column] = what; } void setString(String rowName, int column, String what) { int rowIndex = getRowIndex(rowName); data[rowIndex][column] = what; } void setInt(int rowIndex, int column, int what) { data[rowIndex][column] = str(what); } void setInt(String rowName, int column, int what) { int rowIndex = getRowIndex(rowName); data[rowIndex][column] = str(what); } void setFloat(int rowIndex, int column, float what) { data[rowIndex][column] = str(what); } void setFloat(String rowName, int column, float what) { int rowIndex = getRowIndex(rowName); data[rowIndex][column] = str(what); } // Write this table as a TSV file void write(PrintWriter writer) { for (int i = 0; i < rowCount; i++) { for (int j = 0; j < data[i].length; j++) { if (j != 0) { writer.print(TAB); } if (data[i][j] != null) { writer.print(data[i][j]); } } writer.println(); } writer.flush(); } }