¿Cómo asignar una escala igual en el eje x en Matplotlib?

Lo que actualmente tengo es esto:

x = [3.0, 4.0, 5.0, 5.0, 6.0, 7.0, 9.0, 9.0, 9.0, 11.0] y = [6.0, 5.0, 4.0, 2.5, 3.0, 2.0, 1.0, 2.0, 2.5, 2.5] 

Que produce el siguiente gráfico:

introduzca la descripción de la imagen aquí

Lo que me gustaría es tener una escala igual en mi eje. Por lo tanto, en lugar de tener una brecha tan grande entre 7 y 9 y también 9 y 11, sería un espacio igual como todos los demás. Se ve así:

introduzca la descripción de la imagen aquí

Para eliminar el 8 y el 10 del gráfico utilicé garrapatas. Aquí está el código relevante:

 ax=fig.add_subplot(111, ylabel="speed") ax.plot(x, y, 'bo') ax.set_xticks(x) 

Ninguno de los ejemplos en la página de matplotlib tiene algo que yo desee. He estado revisando la documentación, pero todo lo relacionado con el ‘escalado’ no hace lo que quiero que haga.

Se puede hacer esto?

Además de mis comentarios al OP, puede trazar contra los números naturales 1 an, donde n es el número de valores de abscisa únicos en su conjunto de datos. A continuación, puede establecer las x ticklabels a estos valores únicos. El único problema que tuve al implementar esto es el manejo de valores de abscisas repetidas. Para intentar y mantener este general se me ocurrió lo siguiente:

 from collections import Counter # Requires Python > 2.7 # Test abscissa values x = [3.0, 4.0, 5.0, 5.0, 6.0, 7.0, 9.0, 9.0, 9.0, 11.0] # Count of the number of occurances of each unique `x` value xcount = Counter(x) # Generate a list of unique x values in the range [0..len(set(x))] nonRepetitive_x = list(set(x)) #making a set eliminates duplicates nonRepetitive_x.sort() #sets aren't ordered, so a sort must be made x_normalised = [_ for i, xx in enumerate(set(nonRepetitive_x)) for _ in xcount[xx]*[i]] 

En este punto tenemos esa print x_normalised da.

 [0, 1, 2, 2, 3, 4, 5, 5, 5, 6] 

Así que trazar y contra x_normalised con

 from matplotlib.figure import Figure fig=Figure() ax=fig.add_subplot(111) y = [6.0, 5.0, 4.0, 2.5, 3.0, 2.0, 1.0, 2.0, 2.5, 2.5] ax.plot(x_normalised, y, 'bo') 

Da

Resultado de la solución presentado como se grafica usando matplotlib

Finalmente, podemos cambiar las tags de marca del eje x para reflejar los valores reales de nuestros datos x originales usando set_xticklabels usando

 ax.set_xticklabels(nonRepetitive_x) 

Editar Para que la gráfica final se vea como la salida deseada en el OP se puede usar

 x1,x2,y1,y2 = ax.axis() x1 = min(x_normalised) - 1 x2 = max(x_normalised) + 1 ax.axis((x1,x2,(y1-1),(y2+1))) #If the above is done, then before set_xticklabels, #one has to add a first and last value. eg: nonRepetitive_x.insert(0,x[0]-1) #for the first tick on the left of the graph nonRepetitive_x.append(x[-1]+1) #for the last tick on the right of the graph