【发布时间】:2019-09-02 22:31:51
【问题描述】:
动机:
我正在尝试可视化包含许多 n 维向量的数据集(假设我有 10k 个向量,n=300 维)。我想做的是为每个 n 维计算一个直方图,并将其绘制为 bins*n 热图中的一条线。
到目前为止,我已经得到了这个:
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
%matplotlib inline
import seaborn as sns
# sample data:
vectors = np.random.randn(10000, 300) + np.random.randn(300)
def ndhist(vectors, bins=500):
limits = (vectors.min(), vectors.max())
hists = []
dims = vectors.shape[1]
for dim in range(dims):
h, bins = np.histogram(vectors[:, dim], bins=bins, range=limits)
hists.append(h)
hists = np.array(hists)
fig = plt.figure(figsize=(16, 9))
sns.heatmap(hists)
axes = fig.gca()
axes.set(ylabel='dimensions', xlabel='values')
print(dims)
print(limits)
ndhist(vectors)
这会生成以下输出:
300
(-6.538069472429366, 6.52159540162285)
问题/疑问:
如何更改坐标轴刻度?
- 对于 y 轴,我想简单地把它改回 matplotlib 的默认值,所以它会选择像
0, 50, 100, ..., 250这样的漂亮刻度(299或300的奖励积分) - 对于 x 轴,我想将显示的 bin 索引转换为 bin(左)边界,然后,如上所述,我想将其改回 matplotlib 的一些“不错”刻度的默认选择,例如
-5, -2.5, 0, 2.5, 5(积分还包括实际限制-6.538, 6.522)
自己的解决方案尝试:
我已经尝试了很多类似以下的方法:
def ndhist_axlabels(vectors, bins=500):
limits = (vectors.min(), vectors.max())
hists = []
dims = vectors.shape[1]
for dim in range(dims):
h, bins = np.histogram(vectors[:, dim], bins=bins, range=limits)
hists.append(h)
hists = np.array(hists)
fig = plt.figure(figsize=(16, 9))
sns.heatmap(hists, yticklabels=False, xticklabels=False)
axes = fig.gca()
axes.set(ylabel='dimensions', xlabel='values')
#plt.xticks(np.linspace(*limits, len(bins)), bins)
plt.xticks(range(len(bins)), bins)
axes.xaxis.set_major_locator(matplotlib.ticker.AutoLocator())
plt.yticks(range(dims+1), range(dims+1))
axes.yaxis.set_major_locator(matplotlib.ticker.AutoLocator())
print(dims)
print(limits)
ndhist_axlabels(vectors)
但是,正如您所见,坐标轴标签非常错误。我的猜测是范围或限制存储在原始轴中的某个位置,但在切换回AutoLocator 时会丢失。非常感谢您朝正确的方向轻推。
【问题讨论】:
标签: python matplotlib histogram seaborn heatmap