Estoy tratando de visualizar el modelo de datos multivariados al leerlos desde múltiples archivos de entrada. Estoy buscando una solución simple para visualizar datos de múltiples categorías leídos de múltiples archivos csv de entrada. El no. De las filas en las entradas oscilan entre 1 y 10000 en archivos individuales. El formato es el mismo de todas las entradas con archivos csv de 4 columnas.

Entrada 1

tweetcricscore 34  51 high

Entrada 2

tweetcricscore 23 46 low
tweetcricscore 24  12 low
tweetcricscore 456 46 low

Entrada 3

tweetcricscore 653  1 medium 
tweetcricscore 789 178 medium

Entrada 4

tweetcricscore 625  46 part
tweetcricscore 86  23 part
tweetcricscore 3  1 part
tweetcricscore 87 8 part
tweetcricscore 98 56 part

Las cuatro entradas son de diferentes categorías y col[1] y col[2] son resultados de pares de algún tipo de clasificación. Todas las entradas aquí son las salidas de la misma clasificación. Quiero visualizarlos de una mejor manera para mostrar todas las categorías en un solo diagrama. Buscando una pitón o pandas soluciones para el mismo. Diagrama de dispersión o cualquier mejor enfoque para trazar.

Ya publiqué esta consulta en la sección de análisis de datos de stack exchange y no tengo suerte, por lo tanto, lo intento aquí. https://datascience.stackexchange.com/questions/11440/multi-model- conjunto de datos-visualización-python

Puede ser algo así como la imagen de abajo donde cada clase tiene su propio marcador y color y puede clasificarse o cualquier otra forma mejor de mostrar los valores de los pares juntos.

Código: Edición 1: Estoy tratando de trazar un diagrama de dispersión con los archivos de entrada anteriores.

import numpy as np
import matplotlib.pyplot as plt
from pylab import*
import math
from matplotlib.ticker import LogLocator
import pandas as pd

df1 = pd.read_csv('input_1.csv', header = None)

df1.columns = ['col1','col2','col3','col4']
plt.df1(kind='scatter', x='col2', y='col3', s=120, c='b', label='Highly')

plt.legend(loc='upper right')
plt.xlabel('Freq (x)')
plt.ylabel('Freq(y)')
#plt.gca().set_xscale("log")
#plt.gca().set_yscale("log")
plt.show()

Error:

Traceback (most recent call last):
  File "00_scatter_plot.py", line 12, in <module>
    plt.scatter(x='col2', y='col3', s=120, c='b', label='High')
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 3087, in scatter
    linewidths=linewidths, verts=verts, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 6337, in scatter
    self.add_collection(collection)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 1481, in add_collection
    self.update_datalim(collection.get_datalim(self.transData))
  File "/usr/lib/pymodules/python2.7/matplotlib/collections.py", line 185, in get_datalim
    offsets = np.asanyarray(offsets, np.float_)
  File "/usr/local/lib/python2.7/dist-packages/numpy/core/numeric.py", line 514, in asanyarray
    return array(a, dtype, copy=False, order=order, subok=True)
ValueError: could not convert string to float: col2

Resultado esperado Trazado- Pandas

Scatter plot

2
Sitz Blogz 10 may. 2016 a las 22:44

4 respuestas

La mejor respuesta

ACTUALIZACIÓN:

Con diferentes colores:

colors = dict(low='DarkBlue', high='red', part='yellow', medium='DarkGreen')

fig, ax = plt.subplots()

for grp, vals in df.groupby('col4'):
    color = colors[grp]
    vals[['col2','col3']].plot.scatter(x='col2', y='col3', ax=ax,
                                       s=120, label=grp, color=color)

PD: tendrá que preocuparse de que todos sus grupos (col4) estén definidos en el diccionario colors

enter image description here

ANTIGUA respuesta:

Asumiendo que ha concatenado / fusionado / unido sus archivos en un solo DF, podemos hacer lo siguiente:

fig, ax = plt.subplots()
[vals[['col2','col3']].plot.scatter(x='col2', y='col3', ax=ax, label=grp)
 for grp, vals in df.groupby('col4')]

enter image description here

PD como tarea: puedes jugar con colores;)

1
MaxU 11 may. 2016 a las 18:08

Primero, en su código de trazado. Hay un par de errores y uno parece solo un error tipográfico basado en el error que incluyó. Después de cambiar los nombres de columna que llama plt.df1(...) Esto debería ser plt.scatter(...) y parece que, por el error que incluyó, es lo que realmente llamó. El problema al que su error lo alerta es que está tratando de llamar a x = 'col2' con 'col2' como el valor que matplotlib quiere trazar. Me doy cuenta de que está tratando de alimentar en 'col2' desde df1 pero desafortunadamente eso no fue lo que hizo. Para hacerlo, solo necesita llamar a plt.scatter(df1.col2, df1.col3, ...) donde df1.col2 y df1.col3 son series que representan sus valores x e y respectivamente. Arreglar esto le dará el siguiente resultado (utilicé input4 ya que tiene la mayoría de los puntos de datos):

enter image description here

En cuanto a trazar varias categorías en un gráfico, tiene varias opciones. Puede cambiar el código de trazado a algo como:

fig, ax = plt.subplots()
ax.plot(df1.col2, df1.col3, 'bo', label='Highly')
ax.plot(df2.col2, df2.col2, 'go', label='Moderately')
ax.legend()
ax.xlabel('Freq (x)')
ax.ylabel('Freq(y)')
plt.show()

Sin embargo, esto es bastante torpe. Mejor sería tener todos los datos en un marco de datos y agregar una columna titulada etiqueta que tome el valor de la etiqueta que desee en función de cómo categoriza los datos. De esa manera, podría usar algo como:

fig, ax = plt.subplots()
for group, name in df.groupby('label'):
    ax.plot(group.x, group.y, marker='o', label=name)
ax.legend()
plt.show()
1
Grr 11 may. 2016 a las 17:58

Considere trazar un pivot_table de un pandas df que concatena los muchos archivos .txt. A continuación se ejecutan dos tipos de pivotes con agrupación Type y agrupación Class2. Las brechas se deben a NaN en los datos pivotados:

import pandas as pd
import numpy as np
from matplotlib import rc, pyplot as plt
import seaborn

# IMPORT .TXT DATA
df = pd.concat([pd.read_table('TweetCricScore1.txt', header=None, sep='\\s+'),
                pd.read_table('TweetCricScore2.txt', header=None, sep='\\s+'),
                pd.read_table('TweetCricScore3.txt', header=None, sep='\\s+'),
                pd.read_table('TweetCricScore4.txt', header=None, sep='\\s+')])    
df.columns = ['Class1', 'Class2', 'Score', 'Type']

# PLOT SETTINGS
font = {'family' : 'arial', 'weight' : 'bold', 'size'   : 10}    
rc('font', **font); rc("figure", facecolor="white"); rc('axes', edgecolor='darkgray')

seaborn.set()      # FOR MODERN COLOR DESIGN

def runplot(pvtdf):
    pvtdf.plot(kind='bar', edgecolor='w',figsize=(10,5), width=0.9, fontsize = 10)    
    locs, labels = plt.xticks()
    plt.title('Tweet Cric Score', weight='bold', size=14)
    plt.legend(loc=1, prop={'size':10}, shadow=True)
    plt.xlabel('Classification', weight='bold', size=12)
    plt.ylabel('Score', weight='bold', size=12)
    plt.tick_params(axis='x', bottom='off', top='off')
    plt.tick_params(axis='y', left='off', right='off')
    plt.ylim([0,100])
    plt.grid(b=False)
    plt.setp(labels, rotation=45, rotation_mode="anchor", ha="right")
    plt.tight_layout()

# PIVOT DATA
sumtable = df.pivot_table(values='Score', index=['Class2'],
                          columns=['Type'], aggfunc=sum)
runplot(sumtable)
sumtable = df.pivot_table(values='Score', index=['Type'],
                          columns=['Class2'], aggfunc=sum)
runplot(sumtable)

Pivot Plot Figure 1 Pivot Plot Figure 2

1
Parfait 11 may. 2016 a las 03:45

Mientras intentaba con la solución de @ MaxU y su solución es genial, pero de alguna manera tuve pocos errores y estaba en proceso de parchear los errores. Encontré esta alternativa Boken que se parece a Seaborn Estoy compartiendo el código solo como una alternativa para la referencia de algunos principiantes.

Código:

import numpy as np
import matplotlib.pyplot as plt
from pylab import*
import math
from matplotlib.ticker import LogLocator
import pandas as pd
from bokeh.charts import Scatter, output_file, show

df = pd.read_csv('input.csv', header = None)

df.columns = ['col1','col2','col3','col4']

scatter = Scatter( df, x='col2', y='col3', color='col4', marker='col4', title='plot', legend=True)

output_file('output.html', title='output')

show(scatter)

Salida:

Output

1
Sitz Blogz 12 may. 2016 a las 06:25