private void processElementData(String[][] data) {
		HashMap<String, Double>[] categories = new HashMap[2];
		categories[0] = new HashMap<String, Double>();
		categories[1] = new HashMap<String, Double>();
		for (int i = 0; i < data.length; i++) {
			for (int j = 0; j < 2; j++) {
				if (!categories[j].containsKey(data[i][j])) {
					Double cat = new Double(categories[j].size());
					categories[j].put(data[i][j], cat);
				}
			}
		}
		circleLabels = new String[categories[1].size()];
		Set<String> keys = categories[1].keySet();
		Iterator it = keys.iterator();
		while (it.hasNext()) {
			String key = (String) it.next();
			int j = categories[1].get(key).intValue();
			circleLabels[j] = key;
		}
		nRows = data.length;
		nCircles = categories[1].size();
		nPolygons = (int) Math.pow(2, nCircles);
		polyData = new double[nPolygons];
		polyAreas = new double[nPolygons];
		polyHats = new double[nPolygons];
		circleData = new double[nCircles];
		centers = new double[nCircles][2];
		int[][] subsets = new int[categories[0].size()][nCircles];
		for (int i = 0; i < nRows; i++) {
			int i1 = categories[0].get(data[i][0]).intValue();
			int j1 = categories[1].get(data[i][1]).intValue();
			subsets[i1][j1]++;
		}
		for (int i = 0; i < subsets.length; i++)
			updateCounts(subsets[i]);

		for (int i = 0; i < polyData.length; i++)
			polyData[i] = polyData[i] / nTot;
		for (int j = 0; j < nCircles; j++) {
			circleData[j] = circleData[j] / nTot;
			if (isEqualArea)
				circleData[j] = 1;
		}
	}