public OlympicBubbleplot(String csvfile) {

		// Help mainly found at:
		// http://www.ifs.tuwien.ac.at/~rind/w/doku.php/java/prefuse-scatterplot

		super(new Visualization());

		table = new Table();

		// Read table from csv file
		try {
			table = new CSVTableReader().readTable(csvfile);
		} catch (DataIOException e) {
			e.printStackTrace();
			System.err.println("Error loading table. Exiting...");
			System.exit(1);
		}

		final Rectangle2D boundsData = new Rectangle2D.Double();
		final Rectangle2D boundsLabelsX = new Rectangle2D.Double();
		final Rectangle2D boundsLabelsY = new Rectangle2D.Double();

		// Look at this for possible implementation
		// https://github.com/prefuse/Flare/blob/master/flare/src/flare/scale/LogScale.as

		// ------------------------------------------------------------------
		// Step 1: setup the visualised data

		VisualTable vt = m_vis.addTable("data", table);

		// Column that will hold data for tooltip to use
		vt.addColumn(
				"label",
				"CONCAT([Country],': ', ' Gold: ', [Gold], ';  Silver: ', [Silver], ';  Bronze: ', [Bronze])");

		// ------------------------------------------------------------------
		// Step 2: setup renderers for visualised data

		m_vis.setRendererFactory(new RendererFactory() {
			AbstractShapeRenderer sr = new ShapeRenderer();
			Renderer arY = new AxisRenderer(Constants.FAR_LEFT,
					Constants.CENTER);
			Renderer arX = new AxisRenderer(Constants.CENTER,
					Constants.FAR_BOTTOM);

			public Renderer getRenderer(VisualItem item) {
				return item.isInGroup("ylab") ? arY
						: item.isInGroup("xlab") ? arX : sr;
			}
		});

		// ------------------------------------------------------------------
		// Step 3: create actions to process the visual data

		x_axis = new AxisLayout("data", "TeamSize", Constants.X_AXIS,
				VisiblePredicate.TRUE);
		y_axis = new AxisLayout("data", "Gold", Constants.Y_AXIS,
				VisiblePredicate.TRUE);

		x_axis.setLayoutBounds(boundsData);
		y_axis.setLayoutBounds(boundsData);

		AxisLabelLayout x_labels = new AxisLabelLayout("xlab", x_axis,
				boundsLabelsX);
		AxisLabelLayout y_labels = new AxisLabelLayout("ylab", y_axis,
				boundsLabelsY);

		// Colour palette for continents
		int[] palette = new int[] {
				// Middle East
				ColorLib.rgba(20, 120, 100, 125),
				// Europe
				ColorLib.rgba(105, 245, 40, 125),
				// Africa
				ColorLib.rgba(200, 200, 135, 125),
				// North America
				ColorLib.rgba(35, 50, 225, 125),
				// South America
				ColorLib.rgba(190, 115, 20, 125),
				// Oceania & some Asia
				ColorLib.rgba(95, 175, 210, 125),
				// Asia
				ColorLib.rgba(220, 15, 40, 125) };

		DataColorAction fill = new DataColorAction("data", "Continent",
				Constants.NOMINAL, VisualItem.FILLCOLOR, palette);

		// Make points hexagons
		int[] shapes = new int[] { Constants.SHAPE_HEXAGON };
		DataShapeAction shape = new DataShapeAction("data", "Country", shapes);

		// Size of points determined by Population
		// Makes points HUGE

		size = new DataSizeAction("data", "Population (in thousands) total", 0,
				Constants.LINEAR_SCALE);
		size.setMinimumSize(1.0);
		size.setMaximumSize(1.0);

		// TODO Background Image?

		ActionList draw = new ActionList(Activity.INFINITY);
		draw.add(x_axis);
		draw.add(y_axis);
		draw.add(x_labels);
		draw.add(y_labels);
		draw.add(size);
		draw.add(shape);
		draw.add(fill);
		draw.add(new RepaintAction());
		m_vis.putAction("draw", draw);

		// ------------------------------------------------------------------
		// Step 4: Setup a display and controls

		setHighQuality(true);
		// set display size
		setSize(720, 500);
		// pan with left-click drag on background
		addControlListener(new PanControl());
		// zoom with right-click drag
		addControlListener(new ZoomControl());

		// Update visuals when user resizes display
		addComponentListener(new ComponentAdapter() {
			public void componentResized(ComponentEvent e) {
				updateBounds(boundsData, boundsLabelsX, boundsLabelsY);
				m_vis.run("update");
			}
		});

		setItemSorter(new ItemSorter() {
			public int score(VisualItem item) {
				int score = super.score(item);
				if (item.isInGroup("data"))
					score++;
				return score;
			}
		});

		// Display specific information when hovering over point
		ToolTipControl ttc = new ToolTipControl("label");
		addControlListener(ttc);

		// ------------------------------------------------------------------
		// Step 5: Launching the visualisation

		updateBounds(boundsData, boundsLabelsX, boundsLabelsY);
		m_vis.run("draw");

	}