我试图通过从多个输入文件中读取多变量数据模型来可视化它。我正在寻找一个简单的解决方案来可视化从多个输入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
答案 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)
答案 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
词典中定义的
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')]
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,因为它具有最多的数据点):
就将几个类别绘制到一个图表上而言,您有几个选项。您可以将绘图代码更改为:
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)
输出: