Tournament Plotting: Who is good against whom? I would like to get insight into who is good against whom. Imagine a tournament setting* of 40 contestants and you're interested in seeing who is good against who in the top 10: how could we make this insightful using graphics?
I'd mostly be interested in just finding out a good (best) method, though I'm also open to specific R/Python/Other software/package suggestions to accomplish it.
The hidden goal would be that you might even see clusters forming of playing styles as some players are good against some others, while their style might be good against yet another group of players!
* All contestants play games against each other and the winner is known 
 A: I would recommend using a fluctuation diagram over a heatmap. Here is an example:

Fluctuation diagrams use area to represent count, instead of color, which is higher on Cleveland's hierarchy of visual skills. 
Sort the players by number of wins, both vertically and horizontally.
It is also possible to include some indicators of confidence in the counts, by using a fluctuation diagram. In the plot above, a permutation test was done to determine if the actual count was around about the expected value, given the marginal frequency (eg how often times the player wins regardless who the opponent is), or above or below. 
In the plot above, solid grey boxes indicate the actual count. The grey outline indicates expected count, if both variables were independent (you would use if both players had equal chance of being selected). Boxes are recolored if they are significantly bigger or smaller than the expected count. 
Oh, plot was computed using R. If anyone wants the code I can send it.
A: I'm guessing you have all the pairwise win-rates? Then perhaps plot then in a grid, with colors indicating win-rate. An implementation in python:
from itertools import product

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

np.random.seed(34563)

# Create win_rates. Symmetric with .5's down the diagonal
win_rates = np.random.uniform(size=(10, 10))
for i, j in product(range(10), repeat=2):
    if i == j:
        win_rates[i, j] = .5
    if i > j:
        win_rates[i, j] = 1 - win_rates[j, i]

def plot_heatmap(win_rates):
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    ax.imshow(win_rates, cmap=cm.bwr_r, interpolation='none')
    ax.get_xaxis().set_visible(False)
    ax.get_yaxis().set_visible(False)
    m = cm.ScalarMappable(cmap=cm.bwr_r)
    m.set_array(win_rates)
    fig.colorbar(m)

    return fig


A natural ordering is simply by placement in the tournament. First let's try by overall win rate, here assuming that everyone plays an equal amount of games against everyone else.
overall_win_rates = np.mean(win_rates, axis=1)
sorted_indexes = np.argsort(-overall_win_rates)
win_rates = win_rates[sorted_indexes]    # Sort rows
win_rates = win_rates[:, sorted_indexes] # Sort columns
overall_win_rates = overall_win_rates[sorted_indexes]

fig = plot_heatmap(win_rates)



Clustering could also be used to order the contestants. Input the matrix of win-rates into some clustering algorithm (see scikit-learn for a variety of them in Python) and put people in the same group next to each other in the ordering. This will cluster people based on their win-rates versus particular people, which is how I would hope to extract some semblance of playing styles. Combine that ordering with a plot like the one above.
This is an example using affinity propagation. I'm actually not very familiar with this algorithm, but it's one of the few that doesn't have the number of clusters as a parameter, which is nice for the application.
from sklearn import cluster
ap = cluster.AffinityPropagation()
clusters = ap.fit_predict(win_rates)

sorted_indexes = np.lexsort([-overall_win_rates, clusters])
win_rates = win_rates[sorted_indexes]
win_rates = win_rates[:, sorted_indexes]
overall_win_rates = overall_win_rates[sorted_indexes]

fig = plot_heatmap(win_rates)


Here, the top rows are a cluster, the next three are a cluster, and the last four are a cluster. Though keep in mind that this is just using the defaults provided, in practice you probably would want to tune the clustering parameters.
Within clusters the rows are sorted by overall win rate. One of several improvements you could make to this figure is an extra column or some way to show overall win rate on the figure, and possibly an indicator for clusters as well.
