¿Cómo trazar dos columnas de un marco de datos de pandas usando puntos?

96

Tengo un marco de datos de pandas y me gustaría trazar valores de una columna frente a los valores de otra columna. Afortunadamente, hay un plotmétodo asociado con los marcos de datos que parece hacer lo que necesito:

df.plot(x='col_name_1', y='col_name_2')

Desafortunadamente, parece que entre los estilos de trazado (enumerados aquí después del kindparámetro) no hay puntos. Puedo usar líneas o barras o incluso densidad pero no puntos. ¿Existe alguna solución que pueda ayudar a resolver este problema?

romano
fuente

Respuestas:

115

Puede especificar el stylede la línea trazada al llamar df.plot:

df.plot(x='col_name_1', y='col_name_2', style='o')

El styleargumento también puede ser a dicto list, por ejemplo:

import numpy as np
import pandas as pd

d = {'one' : np.random.rand(10),
     'two' : np.random.rand(10)}

df = pd.DataFrame(d)

df.plot(style=['o','rx'])

Todos los formatos de estilo aceptados se enumeran en la documentación de matplotlib.pyplot.plot.

Salida

empapado
fuente
78

Para esto (y la mayoría de los gráficos) no confiaría en los envoltorios de Pandas para matplotlib. En su lugar, use matplotlib directamente:

import matplotlib.pyplot as plt
plt.scatter(df['col_name_1'], df['col_name_2'])
plt.show() # Depending on whether you use IPython or interactive mode, etc.

y recuerde que puede acceder a una matriz NumPy de los valores de la columna con, df.col_name_1.valuespor ejemplo.

Tuve problemas al usar esto con el trazado predeterminado de Pandas en el caso de una columna de valores de marca de tiempo con precisión de milisegundos. Al tratar de convertir los objetos a datetime64tipo, también descubrí un problema desagradable: < Pandas da un resultado incorrecto al preguntar si los valores de la columna de marca de tiempo tienen attr astype >.

ely
fuente
3

Pandasse utiliza matplotlibcomo biblioteca para parcelas básicas. La forma más sencilla en su caso será utilizar lo siguiente:

import pandas as pd
import numpy as np

#creating sample data 
sample_data={'col_name_1':np.random.rand(20),
      'col_name_2': np.random.rand(20)}
df= pd.DataFrame(sample_data)
df.plot(x='col_name_1', y='col_name_2', style='o')

ingrese la descripción de la imagen aquí

Sin embargo, recomendaría usar seaborncomo solución alternativa si desea tener más parcelas personalizadas sin pasar al nivel básico de matplotlib.En este caso, la solución será la siguiente:

import pandas as pd
import seaborn as sns
import numpy as np

#creating sample data 
sample_data={'col_name_1':np.random.rand(20),
      'col_name_2': np.random.rand(20)}
df= pd.DataFrame(sample_data)
sns.scatterplot(x="col_name_1", y="col_name_2", data=df)

ingrese la descripción de la imagen aquí

Dr. Arslan
fuente