Parcelas de dispersión múltiple con matplotlib y cadenas en el eje x.

Estoy tratando de hacer tres diagtwigs de dispersión en una figura. Lo intenté de esta manera.

Haz una importación primero.

import matplotlib.pyplot as plt 

Defina las variables y haga una figura que contenga tres diagtwigs de dispersión.

 c_pop = [0.410, -0.094, -0.111, -0.106, -0.090, 0.070, -0.043, -0.181, 0.221] c_labels = ['ll120', 'll123', 'll124', 'll27', 'll28', 'll30', 'll446, n12', 'll447, n86', 'll471'] pre_lo = [-0.493] post_lo = [0.145] lo_label = ['lo'] fig = plt.figure() ax1 = fig.add_subplot(111) ax1.scatter(c_labels, c_pop, color='black') ax1.scatter(lo_label, pre_lo, color='green', label='pre-SNEP') ax1.scatter(lo_label, post_lo, color='red', label='post-SNEP') plt.show() 

El error que recibo es: no se pudo convertir la cadena a flotar: lo

Parece que intenta convertir lo_label en otra cosa.

El código se ejecuta si deshabilito el primer diagtwig de dispersión y solo ejecuto el segundo y el tercero. También se ejecuta cuando solo ejecuto el primer diagtwig de dispersión y deshabilito el segundo el tercero.

¿Qué va mal? ¿Es posible hacer tres diagtwigs de dispersión en una gráfica con tags en el eje x?

El soporte categórico de matplotlib es una característica bastante nueva en matplotlib 2.1. Hay algunos problemas en los que todavía se está trabajando.

Matplotlib> = 2.1.1

El código de la pregunta funciona bien en matplotlib 2.1.1 o superior.

 import matplotlib.pyplot as plt import numpy as np x1 = ["apple", "banana", "apple", "cherry"] x2 = ["cherry", "date"] y1 = [1,2,2,2] y2 = [3,4] fig = plt.figure() ax1 = fig.add_subplot(111) ax1.scatter(x1, y1, color='black', label='Initial Fruits') ax1.scatter(x2, y2, color='green', label='Further Fruits') plt.legend() plt.show() 

Matplotlib <= 2.1.0

Si bien matplotlib 2.1.0 permite en principio trazar categorías, no es posible agregar más categorías a los ejes categóricos existentes. Por lo tanto, sería necesario utilizar una solución que también funcionaría para versiones incluso más bajas, que representan los valores como datos numéricos.

 import matplotlib.pyplot as plt import numpy as np x1 = ["apple", "banana", "apple", "cherry"] x2 = ["cherry", "date"] y1 = [1,2,2,2] y2 = [3,4] c = ["black"]*len(x1) + ["green"]*len(x2) u, inv = np.unique(x1+x2, return_inverse=True) fig = plt.figure() ax1 = fig.add_subplot(111) ax1.scatter(inv, y1+y2, c=c, ) f = lambda c : plt.plot([],color=c, ls="", marker="o")[0] ax1.legend(handles = [f("black"), f("green")], labels=['Initial Fruits', 'Further Fruits']) ax1.set_xticks(range(len(u))) ax1.set_xticklabels(u) plt.show() 

Parcela resultante en ambos casos:

introduzca la descripción de la imagen aquí