private static void drawCountGraph(Graphics g, GraphPanel graphPanel) {
		g.setFont(new Font("Arial", Font.PLAIN, 10));
		int graphHeight = graphPanel.getHeight(), graphWidth = graphPanel.getWidth();
		double scalarX = lastRetrievedVirusCount * 1.05 / graphWidth;
		double scalarY = maxCount * 1.05 / graphHeight;
		int xOffset = graphWidth / 42; // 1/42 = (1+(1/1.05))/2
		int yOffset = graphHeight / 42;
		int gH = graphHeight - yOffset;
		HashMap<Color, int[]> lastPoints = new HashMap<Color, int[]>();
		for (Map.Entry<Long, TreeMap<Virus, Integer>> e : virusCount.entrySet()) {
			for (Map.Entry<Virus, Integer> ee : e.getValue().entrySet()) {
				Color c = ee.getKey().getColor();
				g.setColor(c);
				int[] lastPos = lastPoints.get(c);
				int x = (int) (e.getKey() / scalarX) + xOffset;
				int y =  gH - (int) (ee.getValue() / scalarY);
				if (lastPos != null) {
					g.drawLine(lastPos[0], lastPos[1], x, y);
				}
				lastPoints.put(c, new int[] {x, y});
			}
		}
		g.setColor(Color.BLACK);
		int count = graphWidth / 80;
		long lastKey = virusCount.lastKey();
		for (int i = 0; i <= count; i++) {
			// The x-axis is always milliseconds, but we want to display seconds
			if (lastKey < 10000) { // Display one decimal if we're looking at less than 10 seconds
				double s = Math.round((i / (double) count * lastKey) / 100.0) / 10.0;
				g.drawString(""+ s, xOffset + i * 80, graphHeight - 2);
			}
			else {
				int s = (int) ((i / (double) count * lastKey) / 1000.0);
				g.drawString(""+ s, xOffset + i * 80, graphHeight - 2);
			}
		}
		count = graphHeight / 80;
		for (int i = 0; i <= count; i++) {
			if (maxCount > 10) {
				int s = (int) (i / (double) count * maxCount);
				g.drawString(""+ s, 2, gH - i * 80);
			}
			else {
				double s = Math.round(i / (double) count * maxCount * 10.0) / 10.0;
				g.drawString(""+ s, 2, gH - i * 80);
			}
		}
	}