0

Я пытаюсь визуализировать многомерную модель данных, читая их из нескольких входных файлов. Я ищу простое решение для визуализации данных нескольких категорий, считываемых из нескольких входных файлов csv. Нет. Из строк в вводах от 1 до 10000 в отдельных файлах. Формат одинаковый для всех входов с четырьмя столбцами csv-файлов.Множественные входы многомерной визуализации данных

вход 1

tweetcricscore 34 51 high 

вход 2

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

вход 3

tweetcricscore 653 1 medium 
tweetcricscore 789 178 medium 

вход 4

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

Четыре входа имеют разные категории и col[1] и col[2] являются парами результатов какой-либо классификации. Все входные данные здесь являются выходами той же классификации. Я хочу лучше визуализировать их, чтобы показать все категории только в одном сюжете. Ищете решения python или pandas для них. График рассеяния или любой лучший подход к сюжету.

Я уже разместил этот запрос в разделе анализа данных обмена стеками, и мне не повезло, поэтому мы пытаемся здесь. https://datascience.stackexchange.com/questions/11440/multi-model-data-set-visualization-python

Возможно, что-то похожее на изображение ниже, где каждый класс имеет свой собственный маркер и цвет и может быть классифицирован или лучший способ показать значения пары вместе.

Код: Редактировать 1: Я пытаюсь построить график рассеяния с указанными выше входными файлами.

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() 

Ошибка:

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 

Ожидаемый результат Plotting- Pandas

Scatter plot

+0

какие 'группа 1' и' 2' группа? – MaxU

+0

@MaxU Это ожидаемый результат от Pandas Doc. Вместо 'Group 1' и' Group 2' у меня будет 'высокий'' '' '' '' '' '' '' '' ' –

ответ

1

UPDATE:

с различными цветами:

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) 

PS Вы должны будете заботиться, что все ваши группы (col4) - определяются в colors словаре

enter image description here

OLD Ответ:

при условии, что вы сцепляются/объединенное/присоединились файлы в один DF, мы можем сделать следующее:

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

PS как homewor k - вы можете играть с цветами;)

+0

До сих пор входы независимы, но нормально, я не могу слить их с этой проблемой, но я увлекаюсь разными маркерами и цветами в отношении групп. Могу ли я запросить полный код, чтобы я больше не путался? –

+0

Спасибо! Серьезно ценю помощь ... Помогли мне много времени. –

+1

@SitzBlogz, всегда рад помочь! :) – MaxU

1

Рассмотрим замышляет pivot_table из панд в ФР, которые сцепляются много .txt файлов. Ниже приведены два типа опорных элементов с группировкой Type и группировкой Class2.Пробелы обусловлены NaN в поворотными данных:

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

+0

Большое вам спасибо. Это отличное представление, что первый сюжет в отношении класса - это то, что я ищу. Но значения в col [1] и col [2] оба являются значениями пары и должны рассматриваться как одна пара значений. Оба они вместе должны быть построены. У столбцов нет заголовков. –

+1

Чтобы эффективно работать, особенно с манипуляциями с фреймами, такими как графика и сводная таблица, подсказки, которые я добавил. Вы можете комбинировать оба в индексе pivot_table: 'index = ['Class1', 'Class2']'. Или соедините первые два столбца как один: 'df ['newcol'] = df ['Class1'] + df ['Class2']. Astype (str)' – Parfait

+0

Пожалуйста, проверьте раздел редактирования. Спасибо –

1

Итак, во-первых, в вашем графическом коде. Есть пара ошибок, и один выглядит как опечатка, основанная на ошибке, которую вы включили. После изменения имен столбцов вы вызываете plt.df1(...) Это должно быть plt.scatter(...), и похоже, что из приведенной вами ошибки это то, что вы на самом деле вызывали. Проблема, о которой предупреждает ваша ошибка, заключается в том, что вы пытаетесь вызвать x = 'col2' с 'col2', являющимся значением matplotlib, которое хочет построить. Я понимаю, что вы пытаетесь прокормить «col2» от df1, но, к сожалению, это не то, что вы сделали. Для этого вам просто нужно позвонить plt.scatter(df1.col2, df1.col3, ...), где df1.col2 и df1.col3 являются рядами, представляющими ваши значения x и y соответственно. Фиксируя это даст вам следующий вывод (я использовал вход4 как это имеет большинство точек данных):

enter image description here

Что касается прокладки нескольких категорий на одной карте у вас есть несколько вариантов. Вы можете изменить код построения кода на что-то вроде:

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() 

Однако это довольно неуклюжий. Лучше было бы иметь все данные в одном фрейме данных и добавить метку с названием столбца, которая берет значение метки, которое вы хотите, в зависимости от того, как вы классифицируете данные. Таким образом, вы могли бы использовать что-то вроде:

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() 
+0

Большое вам спасибо .. :) вы, ребята, собираетесь научите меня python в ближайшее время .. Серьезно оцените помощь –

+1

Цикл MaxU for будет делать то же самое, что и мое окончательное предложение (кроме того, что мой по умолчанию даст вам разные цвета), для дальнейшего чтения найдите справки (список, словарь и т. д.), как так написано. Я предпочитаю их, но считаю, что они могут немного запутать новых пользователей-питонов. – Grr

1

при попытке с помощью раствора @ MaxU и его решение является большим, но как-то у меня было несколько ошибок и в процессе залатать ошибки. Я наткнулся на эту альтернативу Boken, которая похожа на Seaborn. Я делюсь кодом как альтернатива для ссылки на новичку.

Код:

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) 

Выход:

Output

Смежные вопросы