Python实现平行坐标图的两种方法:pyecharts与pandas对比
本文介绍在Python中利用pyecharts和pandas库绘制平行坐标图的两种方法。通过Iris数据集示例,对比两种工具在颜色分类和坐标轴独立性方面的表现,指出当前实现中存在的局限性,并提供相关代码参考。
平行坐标图简介
平行坐标图是一种常用的数据可视化手段,通过多个垂直平行的坐标轴来展示多维数据。每个坐标轴代表一个维度,轴上的刻度表示该属性的具体数值,连接各轴刻度的折线代表一个样本,不同颜色通常用于区分不同的类别。
然而,在Python环境中实现按类别自动分配不同颜色的平行坐标图存在一定难度。若对颜色区分有严格要求,可能需要探索其他解决方案或工具。

下图展示了基于Iris数据集生成的平行坐标图示例。
分隔线
基于pyecharts的实现
接下来介绍具体的代码实现。
第一种方法:使用pyecharts第三方库。
pyecharts代码示例
from pyecharts import Parallel
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
data = pd.read_csv('iris.csv')
data_1 = np.array(data[['Sepal_length', 'Sepal_width', 'Petal_length', 'Petal_width']]).tolist()
schema = ['Sepal_length', 'Sepal_width', 'Petal_length', 'Petal_width']
parallel = Parallel('iris平行坐标图')
parallel.config(schema)
parallel.add('dasfd',data_1,is_random = True)
parallel
运行上述代码生成的结果与上图一致,但未能实现按类别区分颜色的功能。这一局限性令人遗憾,甚至让人产生挫败感。
尽管如此,pyecharts库功能强大,支持多种图表类型,建议感兴趣的用户尝试安装使用。
基于pandas的实现
第二种方法:使用pandas库。
pandas主要用于数据处理,是否具备绘图功能?这似乎有些出乎意料。
实际上,pandas确实支持绘制平行坐标图。以下是具体代码:
pandas代码示例
import matplotlib.pyplot as plt
import pandas as pd
from pandas.tools.plotting import parallel_coordinates
data = pd.read_csv('iris.csv')
data_1 =data[['Species','Sepal_length', 'Sepal_width', 'Petal_length', 'Petal_width']]
parallel_coordinates(data_1,'Species')
plt.legend(loc='upper center', bbox_to_anchor=(0.5,-0.1),ncol=3,fancybox=True,shadow=True)
plt.show()
运行代码后,结果如下图所示。

虽然图中显示了不同颜色,但每个坐标轴的刻度范围均为0-8,未能实现各轴独立刻度的需求。理想情况下,每个轴应根据数据范围独立缩放。
以上是在Python中实现平行坐标图的两种尝试结果。目前两种方法均未能完美满足“轴独立”和“颜色区分”的需求。若读者有更好方案,欢迎分享。
Echarts实现与总结
尽管Python实现未达预期,最终仍使用Echarts完成了可视化(有时转换工具是必要的)。

附上相关代码,供参考:
Echarts代码示例
// Schema:
// date,AQIindex,PM2.5,PM10,CO,NO2,SO2
var data1 = [[5.1, 3.5, 1.4, 0.2], [4.9, 3.0, 1.4, 0.2], [4.7, 3.2, 1.3, 0.2], [4.6, 3.1, 1.5, 0.2], [5.0, 3.6, 1.4, 0.2], [5.4, 3.9, 1.7, 0.4], [4.6, 3.4, 1.4, 0.3], [5.0, 3.4, 1.5, 0.2], [4.4, 2.9, 1.4, 0.2], [4.9, 3.1, 1.5, 0.1], [5.4, 3.7, 1.5, 0.2], [4.8, 3.4, 1.6, 0.2], [4.8, 3.0, 1.4, 0.1], [4.3, 3.0, 1.1, 0.1], [5.8, 4.0, 1.2, 0.2], [5.7, 4.4, 1.5, 0.4], [5.4, 3.9, 1.3, 0.4], [5.1, 3.5, 1.4, 0.3], [5.7, 3.8, 1.7, 0.3], [5.1, 3.8, 1.5, 0.3], [5.4, 3.4, 1.7, 0.2], [5.1, 3.7, 1.5, 0.4], [4.6, 3.6, 1.0, 0.2], [5.1, 3.3, 1.7, 0.5], [4.8, 3.4, 1.9, 0.2], [5.0, 3.0, 1.6, 0.2], [5.0, 3.4, 1.6, 0.4], [5.2, 3.5, 1.5, 0.2], [5.2, 3.4, 1.4, 0.2], [4.7, 3.2, 1.6, 0.2], [4.8, 3.1, 1.6, 0.2], [5.4, 3.4, 1.5, 0.4], [5.2, 4.1, 1.5, 0.1], [5.5, 4.2, 1.4, 0.2], [4.9, 3.1, 1.5, 0.1], [5.0, 3.2, 1.2, 0.2], [5.5, 3.5, 1.3, 0.2], [4.9, 3.1, 1.5, 0.1], [4.4, 3.0, 1.3, 0.2], [5.1, 3.4, 1.5, 0.2], [5.0, 3.5, 1.3, 0.3], [4.5, 2.3, 1.3, 0.3], [4.4, 3.2, 1.3, 0.2], [5.0, 3.5, 1.6, 0.6], [5.1, 3.8, 1.9, 0.4], [4.8, 3.0, 1.4, 0.3], [5.1, 3.8, 1.6, 0.2], [4.6, 3.2, 1.4, 0.2], [5.3, 3.7, 1.5, 0.2], [5.0, 3.3, 1.4, 0.2]
];
var data2 = [[7.0, 3.2, 4.7, 1.4], [6.4, 3.2, 4.5, 1.5], [6.9, 3.1, 4.9, 1.5], [5.5, 2.3, 4.0, 1.3], [6.5, 2.8, 4.6, 1.5], [5.7, 2.8, 4.5, 1.3], [6.3, 3.3, 4.7, 1.6], [4.9, 2.4, 3.3, 1.0], [6.6, 2.9, 4.6, 1.3], [5.2, 2.7, 3.9, 1.4], [5.0, 2.0, 3.5, 1.0], [5.9, 3.0, 4.2, 1.5], [6.0, 2.2, 4.0, 1.0], [6.1, 2.9, 4.7, 1.4], [5.6, 2.9, 3.6, 1.3], [6.7, 3.1, 4.4, 1.4], [5.6, 3.0, 4.5, 1.5], [5.8, 2.7, 4.1, 1.0], [6.2, 2.2, 4.5, 1.5], [5.6, 2.5, 3.9, 1.1], [5.9, 3.2, 4.8, 1.8], [6.1, 2.8, 4.0, 1.3], [6.3, 2.5, 4.9, 1.5], [6.1, 2.8, 4.7, 1.2], [6.4, 2.9, 4.3, 1.3], [6.6, 3.0, 4.4, 1.4], [6.8, 2.8, 4.8, 1.4], [6.7, 3.0, 5.0, 1.7], [6.0, 2.9, 4.5, 1.5], [5.7, 2.6, 3.5, 1.0], [5.5, 2.4, 3.8, 1.1], [5.5, 2.4, 3.7, 1.0], [5.8, 2.7, 3.9, 1.2], [6.0, 2.7, 5.1, 1.6], [5.4, 3.0, 4.5, 1.5], [6.0, 3.4, 4.5, 1.6], [6.7, 3.1, 4.7, 1.5], [6.3, 2.3, 4.4, 1.3], [5.6, 3.0, 4.1, 1.3], [5.5, 2.5, 4.0, 1.3], [5.5, 2.6, 4.4, 1.2], [6.1, 3.0, 4.6, 1.4], [5.8, 2.6, 4.0, 1.2], [5.0, 2.3, 3.3, 1.0], [5.6, 2.7, 4.2, 1.3], [5.7, 3.0, 4.2, 1.2], [5.7, 2.9, 4.2, 1.3], [6.2, 2.9, 4.3, 1.3], [5.1, 2.5, 3.0, 1.1], [5.7, 2.8, 4.1, 1.3]
];
var data3 = [[6.3, 3.3, 6.0, 2.5], [5.8, 2.7, 5.1, 1.9], [7.1, 3.0, 5.9, 2.1], [6.3, 2.9, 5.6, 1.8], [6.5, 3.0, 5.8, 2.2], [7.6, 3.0, 6.6, 2.1], [4.9, 2.5, 4.5, 1.7], [7.3, 2.9, 6.3, 1.8], [6.7, 2.5, 5.8, 1.8], [7.2, 3.6, 6.1, 2.5], [6.5, 3.2, 5.1, 2.0], [6.4, 2.7, 5.3, 1.9], [6.8, 3.0, 5.5, 2.1], [5.7, 2.5, 5.0, 2.0], [5.8, 2.8, 5.1, 2.4], [6.4, 3.2, 5.3, 2.3], [6.5, 3.0, 5.5, 1.8], [7.7, 3.8, 6.7, 2.2], [7.7, 2.6, 6.9, 2.3], [6.0, 2.2, 5.0, 1.5], [6.9, 3.2, 5.7, 2.3], [5.6, 2.8, 4.9, 2.0], [7.7, 2.8, 6.7, 2.0], [6.3, 2.7, 4.9, 1.8], [6.7, 3.3, 5.7, 2.1], [7.2, 3.2, 6.0, 1.8], [6.2, 2.8, 4.8, 1.8], [6.1, 3.0, 4.9, 1.8], [6.4, 2.8, 5.6, 2.1], [7.2, 3.0, 5.8, 1.6], [7.4, 2.8, 6.1, 1.9], [7.9, 3.8, 6.4, 2.0], [6.4, 2.8, 5.6, 2.2], [6.3, 2.8, 5.1, 1.5], [6.1, 2.6, 5.6, 1.4], [7.7, 3.0, 6.1, 2.3], [6.3, 3.4, 5.6, 2.4], [6.4, 3.1, 5.5, 1.8], [6.0, 3.0, 4.8, 1.8], [6.9, 3.1, 5.4, 2.1], [6.7, 3.1, 5.6, 2.4], [6.9, 3.1, 5.1, 2.3], [5.8, 2.7, 5.1, 1.9], [6.8, 3.2, 5.9, 2.3], [6.7, 3.3, 5.7, 2.5], [6.7, 3.0, 5.2, 2.3], [6.3, 2.5, 5.0, 1.9], [6.5, 3.0, 5.2, 2.0], [6.2, 3.4, 5.4, 2.3], [5.9, 3.0, 5.1, 1.8]
];
var schema = [
{name: 'Sepal_length', index: 0, text: 'Sepal_length'},
{name: 'Sepal_width', index: 1, text: 'Sepal_width'},
{name: 'Petal_length', index: 2, text: 'Petal_length'},
{name: 'Petal_width', index: 3, text: 'Petal_width'},
];
var lineStyle = {
normal: {
width: 1,
opacity: 0.5
}
};
option = {
legend: {
top: 0,
data:['Iris-setosa','Iris-versicolor','Iris-virginica'],
itemGap: 10
},
parallelAxis: [
{dim: 0, name: schema[0].text},
{dim: 1, name: schema[1].text},
{dim: 2, name: schema[2].text},
],
parallel: {
left: '5%',
right: '13%',
bottom: '10%',
top: '15%',
parallelAxisDefault: {
type: 'value',
name: '平行坐标',
nameLocation: 'end',
nameGap: 20,
nameTextStyle: {
fontSize: 12
}
}
},
series: [
{
name: 'Iris-setosa',
type: 'parallel',
lineStyle: lineStyle,
data: data1
},
{
name: 'Iris-versicolor',
type: 'parallel',
lineStyle: lineStyle,
data: data2
},
{
name: 'Iris-virginica',
type: 'parallel',
lineStyle: lineStyle,
data: data3
},
]
};
感谢您的阅读与支持,欢迎点赞。
本文分享了Python实现平行坐标图的两种方法,希望能为读者提供参考。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









