2

複数の入力ファイルからそれらを読み取って、多変量データ モデルを視覚化しようとしています。複数の入力 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

4 つの入力はそれぞれ異なるカテゴリでありcol[1]col[2]ある種の分類のペアの結果です。ここでのすべての入力は、同じ分類の出力です。すべてのカテゴリを 1 つのプロットのみに表示するために、それらをより良い方法で視覚化したいと考えています。同じための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

期待される出力プロット - パンダ

散布図

4

4 に答える 4

2

@MaxUのソリューションと彼のソリューションを試している間、彼のソリューションは素晴らしいですが、どういうわけかエラーがほとんどなく、エラーにパッチを当てる進行中です。Seabornに似たこの代替Bokenに出くわしました。初心者向けの参照用の代替としてコードを共有しています。

コード:

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)

出力:

出力

于 2016-05-12T06:25:46.460 に答える
1

多くの .txt ファイルを連結する pandas df の pivot_table をプロットすることを検討してください。Type以下は、グループ化とグループ化を使用して 2 種類のピボットを実行し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 ピボット プロット図 2

于 2016-05-11T03:45:39.813 に答える
1

まず、プロットコードで。いくつかのエラーがあり、1 つはあなたが含めたエラーに基づくタイプミスのように見えます。呼び出す列名を変更した後、plt.df1(...)これはそうあるべきでplt.scatter(...)あり、含めたエラーから、実際に呼び出したように見えます。エラーが警告している問題は、matplotlib がプロットしたい値である 'col2' を使用して x='col2' を呼び出そうとしていることです。df1 から 'col2' をフィードしようとしていることがわかりましたが、残念ながらそれはあなたがしたことではありません。plt.scatter(df1.col2, df1.col3, ...)これを行うには、df1.col2 と df1.col3 がそれぞれ x と y の値を表すシリーズである場所を呼び出すだけです。これを修正すると、次の出力が得られます (データ ポイントが最も多いため、input4 を使用しました)。

ここに画像の説明を入力

複数のカテゴリを 1 つのグラフにプロットする限り、いくつかのオプションがあります。プロット コードを次のように変更できます。

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

ただし、これはかなり厄介です。すべてのデータを 1 つのデータフレームに格納し、データの分類方法に基づいて必要なラベル値を取得する label というタイトルの列を追加することをお勧めします。そうすれば、次のようなものを使用できます。

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()
于 2016-05-11T17:54:45.223 に答える