多输入多变量数据可视化

时间:2016-05-10 19:44:20

标签: python pandas data-visualization multivalue multivariate-testing

我试图通过从多个输入文件中读取多变量数据模型来可视化它。我正在寻找一个简单的解决方案来可视化从多个输入csv文件读取的多个类别数据。没有。输入中的行在单个文件中的范围为1到10000。格式与4列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

4 个答案:

答案 0 :(得分:1)

考虑绘制一个连接许多.txt文件的pandas df的pivot_table。下面通过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

答案 1 :(得分:1)

<强>更新

有不同的颜色:

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作为家庭作业 - 你可以玩颜色;)

答案 2 :(得分:1)

首先,在您的绘图代码中。有几个错误,一个看起来只是一个错字根据您包含的错误。更改列名后,您调用plt.df1(...)这应该是plt.scatter(...),它看起来就像您包含的错误,就是您实际调用的内容。您的错误提醒您的问题是您尝试拨打x =&#39; col2&#39;用&#39; col2&#39;是matplotlib想要绘制的值。我意识到你正在尝试用#col;&#39; col2&#39;来自df1,但不幸的是,这不是你做的。为此,您只需调用plt.scatter(df1.col2, df1.col3, ...),其中df1.col2和df1.col3分别代表您的x和y值。修复此问题将为您提供以下输出(我使用input4,因为它具有最多的数据点):

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

答案 3 :(得分: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