Una manera de abordar el problema es pensar en cada una 'fila' en su Dispersión/Puntos parcela/beeswarm como una papelera en un histograma:
data = np.random.randn(100)
width = 0.8 # the maximum width of each 'row' in the scatter plot
xpos = 0 # the centre position of the scatter plot in x
counts, edges = np.histogram(data, bins=20)
centres = (edges[:-1] + edges[1:])/2.
yvals = centres.repeat(counts)
max_offset = width/counts.max()
offsets = np.hstack((np.arange(cc) - 0.5 * (cc - 1)) for cc in counts)
xvals = xpos + (offsets * max_offset)
fig, ax = plt.subplots(1, 1)
ax.scatter(xvals, yvals, s=30, c='b')
Obviamente, esto implica a agrupar los datos, por lo que puede perder algo de precisión.Si tiene datos discretos, puede reemplazar:
counts, edges = np.histogram(data, bins=20)
centres = (edges[:-1] + edges[1:])/2.
con:
centres, counts = np.unique(data, return_counts=True)
Un enfoque alternativo que conserva las exactas coordenadas, incluso para los datos continuos, es utilizar un kernel density estimate para escalar la amplitud de la fluctuación de fase aleatoria en el eje x:
from scipy.stats import gaussian_kde
kde = gaussian_kde(data)
density = kde(data) # estimate the local density at each datapoint
# generate some random jitter between 0 and 1
jitter = np.random.rand(*data.shape) - 0.5
# scale the jitter by the KDE estimate and add it to the centre x-coordinate
xvals = 1 + (density * jitter * width * 2)
ax.scatter(xvals, data, s=30, c='g')
for sp in ['top', 'bottom', 'right']:
ax.spines[sp].set_visible(False)
ax.tick_params(top=False, bottom=False, right=False)
ax.set_xticks([0, 1])
ax.set_xticklabels(['Histogram', 'KDE'], fontsize='x-large')
fig.tight_layout()
Este segundo cumplido hod está basado libremente en cómo funciona violin plots. Todavía no puedo garantizar que ninguno de los puntos se superponga, pero me parece que en la práctica tiende a dar resultados bastante agradables siempre que haya una cantidad decente de puntos (> 20), y la distribución se puede aproximar razonablemente bien por una suma de gaussianos.
En un [gráfico de puntos] (http://en.wikipedia.org/wiki/Dot_plot_ (estadísticas)) estos puntos ya están separados en su columna – joaquin
La definición wiki de "gráfico de puntos" no es lo que estoy tratando de describir, pero nunca he oído hablar de un término que no sea "gráfico de puntos" para él. Es aproximadamente un diagrama de dispersión pero con etiquetas x arbitrarias (no necesariamente numéricas). Así, en el ejemplo que describo en la pregunta, habría una columna de valores para "Categoría A", una segunda columna para "Categoría B", etc. (_Editar_: la definición de wikipedia de "Plan de puntos de Cleveland" es más similar a lo que Estoy buscando, aunque todavía no es exactamente lo mismo.) – iayork