基于 pandas 系列列表创建二维绘图像素网格
Create a 2D plot pixel grid based on a pandas series of lists
假设我们有一个 pandas 系列列表,其中每个列表包含一些描述为字符串的特征,如下所示:
0 ["A", "C", "G", ...]
1 ["B", "C", "H", ...]
2 ["A", "X"]
...
N ["J", "K", ...]
绘制二维像素网格的 best/easiest 方法是什么,其中 X 轴是特征的出现,Y 轴是系列 0,1,2,..., N 中的每个样本?
16 月 22 日编辑:
我似乎没有明确提到特征列表不一定对所有观察具有相同的大小。观察 1 可以有 4 个特征,观察 2 可以没有一个,观察 3 可以有 5 个,依此类推。因此,如果不以某种方式对它们进行预处理以填充缺失的特征,我无法立即将它们转换为 numpy 数组。
使用 pandas 一维直方图似乎很简单,如 答案。您可以使用这个想法并用 26 填充 N 的数组,然后使用
在 2D 中绘制
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import random
import string
from collections import Counter
#Generate list of letters and dataframe
N = 20
M = 1000
letterlist = []
for i in range(N):
letterlist.append([random.choice(string.ascii_uppercase) for i in range(M)])
df = pd.DataFrame(letterlist)
#Fill an array of size N by 26
im = np.zeros([N,26])
for n in range(N):
#Get histogram of letters for a line as Dict
letter_counts = Counter(df.loc[n])
#Add to array
for k in letter_counts.keys():
c = ord(k.lower()) - 97
im[n,c] = letter_counts[k]
#Plot
plt.imshow(im, interpolation='none')
plt.colorbar()
plt.axis('tight')
plt.xticks(range(26), [i for i in string.ascii_uppercase])
plt.show()
因为我已经在我的评论中写下了图像的代码,而且 Ed 似乎和我对你的问题有相同的解释,我将继续添加我的解决方案。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import string
M, N = 100, 10
letters = list(string.ascii_uppercase)
data = np.random.choice(letters, (M, N))
df = pd.DataFrame(data)
# Get frequency of letters in each column using pd.value_counts
df_freq = df.apply(pd.value_counts).T
# Plot frequency dataframe with seaborn heatmap
ax = sns.heatmap(df_freq, linewidths=0.1, annot=False, cbar=True)
plt.show()
假设我们有一个 pandas 系列列表,其中每个列表包含一些描述为字符串的特征,如下所示:
0 ["A", "C", "G", ...]
1 ["B", "C", "H", ...]
2 ["A", "X"]
...
N ["J", "K", ...]
绘制二维像素网格的 best/easiest 方法是什么,其中 X 轴是特征的出现,Y 轴是系列 0,1,2,..., N 中的每个样本?
16 月 22 日编辑:
我似乎没有明确提到特征列表不一定对所有观察具有相同的大小。观察 1 可以有 4 个特征,观察 2 可以没有一个,观察 3 可以有 5 个,依此类推。因此,如果不以某种方式对它们进行预处理以填充缺失的特征,我无法立即将它们转换为 numpy 数组。
使用 pandas 一维直方图似乎很简单,如
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import random
import string
from collections import Counter
#Generate list of letters and dataframe
N = 20
M = 1000
letterlist = []
for i in range(N):
letterlist.append([random.choice(string.ascii_uppercase) for i in range(M)])
df = pd.DataFrame(letterlist)
#Fill an array of size N by 26
im = np.zeros([N,26])
for n in range(N):
#Get histogram of letters for a line as Dict
letter_counts = Counter(df.loc[n])
#Add to array
for k in letter_counts.keys():
c = ord(k.lower()) - 97
im[n,c] = letter_counts[k]
#Plot
plt.imshow(im, interpolation='none')
plt.colorbar()
plt.axis('tight')
plt.xticks(range(26), [i for i in string.ascii_uppercase])
plt.show()
因为我已经在我的评论中写下了图像的代码,而且 Ed 似乎和我对你的问题有相同的解释,我将继续添加我的解决方案。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import string
M, N = 100, 10
letters = list(string.ascii_uppercase)
data = np.random.choice(letters, (M, N))
df = pd.DataFrame(data)
# Get frequency of letters in each column using pd.value_counts
df_freq = df.apply(pd.value_counts).T
# Plot frequency dataframe with seaborn heatmap
ax = sns.heatmap(df_freq, linewidths=0.1, annot=False, cbar=True)
plt.show()