日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python画平行坐标图_Matplotlib中的平行坐标图

發布時間:2025/3/20 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python画平行坐标图_Matplotlib中的平行坐标图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用傳統的繪圖類型可以相對直觀地查看二維和三維數據。即使是四維數據,我們也經常能找到顯示數據的方法。不過,4維以上的維度越來越難以顯示。幸運的是,parallel coordinates plots提供了一種查看高維結果的機制。

有幾個繪圖包提供平行坐標繪圖,例如Matlab、R、VTK type 1和VTK type 2,但我不知道如何使用Matplotlib創建一個。Matplotlib中是否有內置的平行坐標圖?我當然看不到。

如果沒有內置類型,是否可以使用Matplotlib的標準功能生成平行坐標圖?

編輯:

基于下面的Zhenya提供的答案,我開發了以下支持任意軸數的泛化。按照我在上面原始問題中發布的示例的打印樣式,每個軸都有自己的比例。我通過規范化每個軸點的數據并使軸的范圍為0到1來實現這一點。然后我回去給每個記號貼上標簽,在截距處給出正確的值。

該函數通過接受一組數據集來工作。每個數據集被視為一組點,其中每個點位于不同的軸上。__main__中的示例為兩組30行中的每個軸獲取隨機數。這些行在導致行聚集的范圍內是隨機的;我想驗證這一行為。

這個解決方案不如內置的解決方案,因為您有奇怪的鼠標行為,我通過標簽偽造數據范圍,但是在Matplotlib添加內置解決方案之前,這是可以接受的。#!/usr/bin/python

import matplotlib.pyplot as plt

import matplotlib.ticker as ticker

def parallel_coordinates(data_sets, style=None):

dims = len(data_sets[0])

x = range(dims)

fig, axes = plt.subplots(1, dims-1, sharey=False)

if style is None:

style = ['r-']*len(data_sets)

# Calculate the limits on the data

min_max_range = list()

for m in zip(*data_sets):

mn = min(m)

mx = max(m)

if mn == mx:

mn -= 0.5

mx = mn + 1.

r = float(mx - mn)

min_max_range.append((mn, mx, r))

# Normalize the data sets

norm_data_sets = list()

for ds in data_sets:

nds = [(value - min_max_range[dimension][0]) /

min_max_range[dimension][2]

for dimension,value in enumerate(ds)]

norm_data_sets.append(nds)

data_sets = norm_data_sets

# Plot the datasets on all the subplots

for i, ax in enumerate(axes):

for dsi, d in enumerate(data_sets):

ax.plot(x, d, style[dsi])

ax.set_xlim([x[i], x[i+1]])

# Set the x axis ticks

for dimension, (axx,xx) in enumerate(zip(axes, x[:-1])):

axx.xaxis.set_major_locator(ticker.FixedLocator([xx]))

ticks = len(axx.get_yticklabels())

labels = list()

step = min_max_range[dimension][2] / (ticks - 1)

mn = min_max_range[dimension][0]

for i in xrange(ticks):

v = mn + i*step

labels.append('%4.2f' % v)

axx.set_yticklabels(labels)

# Move the final axis' ticks to the right-hand side

axx = plt.twinx(axes[-1])

dimension += 1

axx.xaxis.set_major_locator(ticker.FixedLocator([x[-2], x[-1]]))

ticks = len(axx.get_yticklabels())

step = min_max_range[dimension][2] / (ticks - 1)

mn = min_max_range[dimension][0]

labels = ['%4.2f' % (mn + i*step) for i in xrange(ticks)]

axx.set_yticklabels(labels)

# Stack the subplots

plt.subplots_adjust(wspace=0)

return plt

if __name__ == '__main__':

import random

base = [0, 0, 5, 5, 0]

scale = [1.5, 2., 1.0, 2., 2.]

data = [[base[x] + random.uniform(0., 1.)*scale[x]

for x in xrange(5)] for y in xrange(30)]

colors = ['r'] * 30

base = [3, 6, 0, 1, 3]

scale = [1.5, 2., 2.5, 2., 2.]

data.extend([[base[x] + random.uniform(0., 1.)*scale[x]

for x in xrange(5)] for y in xrange(30)])

colors.extend(['b'] * 30)

parallel_coordinates(data, style=colors).show()

編輯2:

下面是一個在繪制Fisher's Iris data時從上述代碼中得到的結果的示例。它不像維基百科上的參考圖片那么好,但是如果你只有Matplotlib并且你需要多維圖的話,它是可以接受的。

總結

以上是生活随笔為你收集整理的python画平行坐标图_Matplotlib中的平行坐标图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。