可以使用传统的绘图类型相对直观地查看二维和三维数据.即使使用四维数据,我们也经常可以找到显示数据的方法.但是,高于4的尺寸变得越来越难以显示.幸运的是,平行坐标图提供了一种查看更高维度结果的机制.
几个绘图包提供了平行坐标图,例如Matlab,R,VTK类型1和VTK类型2,但我没有看到如何使用Matplotlib创建一个.
编辑:
根据以下振亚提供的答案,我开发了以下支持任意数量轴的概括.按照我在上面原始问题中发布的示例的绘图样式,每个轴都有自己的比例.我通过对每个轴点的数据进行归一化并使轴的范围为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 …
Run Code Online (Sandbox Code Playgroud) 有谁知道是否有办法ggparcoord
在GGally中为函数添加变量标签?我尝试了很多方法geom_text
,但没有任何结果.
为了更明确,我希望row.names(mtcars)
通过geom_text
.我可以区分汽车的唯一方法是row.names(mtcars)
通过groupColumn
论证,但我不喜欢这种看法.
不起作用:
mtcars$carName <- row.names(mtcars) # This becomes column 12
library(GGally)
# Attempt 1
ggparcoord(mtcars,
columns = c(12, 1, 6),
groupColumn = 1) +
geom_text(aes(label = carName))
# Attempt 2
ggparcoord(mtcars,
columns = c(12, 1, 6),
groupColumn = 1,
mapping = aes(label = carName))
Run Code Online (Sandbox Code Playgroud)
任何想法,将不胜感激!
给定一个新的会话,执行函数文档中提供的小ggparcoord(.)示例
library(GGally)
data(diamonds, package="ggplot2")
diamonds.samp <- diamonds[sample(1:dim(diamonds)[1], 100), ]
ggparcoord(data = diamonds.samp, columns = c(1, 5:10))
Run Code Online (Sandbox Code Playgroud)
结果如下:
再次,从一个新的会话开始并使用加载的dplyr执行相同的脚本
library(GGally)
library(dplyr)
data(diamonds, package="ggplot2")
diamonds.samp <- diamonds[sample(1:dim(diamonds)[1], 100), ]
ggparcoord(data = diamonds.samp, columns = c(1, 5:10))
Run Code Online (Sandbox Code Playgroud)
结果是:
错误:(列表)对象无法强制输入'double'
需要注意的是顺序库()语句也没有关系.
问题
我需要更大的分析中的dplyr和ggparcoord(.),但这个最小的例子反映了我面临的问题.
版本
UPDATE
将Joran给出的优秀答案包括起来:
答案
当我尝试在ggplot2中创建一个并行坐标时,我得到了一个不推荐使用的消息:
require(ggplot2)
ggpcp(mtcars) + geom_line()
Run Code Online (Sandbox Code Playgroud)
警告消息:不推荐使用'ggpcp'.请参阅帮助("已弃用")
然而,ggplot文档没有说明这一点:http://docs.ggplot2.org/current/ggpcp.html .
某个地方有新的pcp功能吗?
我正在寻找一种向d3js平行坐标添加分类数据的方法.D3js对我来说是新手,我可以理解正在做的一些事情,但却无法找到一种方法.并行集不是一个好选择,因为我的大部分数据都是连续的.
如果您考虑汽车示例,我希望能够按轴上的品牌进行过滤(例如过滤器,以便仅显示福特上的数据).我假设需要一个变量来定义每辆车(例如标致,福特,宝马,奥迪等......)
这是汽车的例子.
感谢任何响应的人.
我想为pandas
包含带有数字的列和其他包含字符串作为值的列的DataFrame绘制平行坐标。
问题描述
我有以下测试代码,用于绘制带有数字的平行坐标:
import pandas as pd
import matplotlib.pyplot as plt
from pandas.tools.plotting import parallel_coordinates
df = pd.DataFrame([["line 1",20,30,100],\
["line 2",10,40,90],["line 3",10,35,120]],\
columns=["element","var 1","var 2","var 3"])
parallel_coordinates(df,"element")
plt.show()
Run Code Online (Sandbox Code Playgroud)
但是,我想尝试的是向我的绘图中添加一些带有字符串的变量。但是当我运行以下代码时:
df2 = pd.DataFrame([["line 1",20,30,100,"N"],\
["line 2",10,40,90,"N"],["line 3",10,35,120,"N-1"]],\
columns=["element","var 1","var 2","var 3","regime"])
parallel_coordinates(df2,"element")
plt.show()
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
ValueError:float() 的无效文字:N
我想这意味着parallel_coordinates
函数不接受字符串。
我正在尝试做的示例
我正在尝试做类似这个例子的事情,其中种族和性别是字符串而不是数字:
题
有没有办法使用 执行这样的图形pandas
parallel_coordinates
?如果没有,我怎么能尝试这样的图形?也许与matplotlib
?
我必须提到我特别在Python 2.5下寻找 带有 pandas 版本的解决方案0.9.0
。
我有点困惑我需要使用javascript加载多个CSV文件,我需要更改加载的每个数据集的一些属性.所以基本上我使用这个名为d3的框架,我想加载3个csv文件,然后对于每个csv文件,我需要更改为平行坐标图绘制的线条颜色.目前我正在使用三个数据加载,但这会弄乱我的情节,我的价值已经全部结束.
// load csv file and create the chart
d3.csv('X.csv', function(data) {
pc = d3.parallelCoordinates()("parallelcoordinates")
.data(data)
.color(color)
.alpha(0.4)
.render()
.brushable() // enable brushing
.interactive() // command line mode
var explore_count = 0;
var exploring = {};
var explore_start = false;
pc.svg
.selectAll(".dimension")
.style("cursor", "pointer")
.on("click", function(d) {
exploring[d] = d in exploring ? false : true;
event.preventDefault();
if (exploring[d]) d3.timer(explore(d,explore_count,pc));
});
Run Code Online (Sandbox Code Playgroud)
我做了以上三次.现在发生的是,所有数据都绘制在同一个图形上,但随后值重叠(基本上它们的三个图形在彼此之上).我希望将它集成在一起,我认为最好的方法是巧妙地加载JS文件并以某种方式操作它.我不知道怎么回事.有人会告诉我我将如何实现这一目标吗?
我试图将基因表达的变化可视化为不同时间点的分类变量(向上、向下、无变化)。
我有一个描述差异表达数据的数据框,如下所示:
data = {'gene':['Svm3G0018840','Svm5G0011050','Svm9G0059770'],
'01h': ['nc','up','down'], '04h': ['up', 'down', 'nc'],'08h':['nc','down','up']}
df=pd.DataFrame.from_dict(data)
df=df.set_index('gene')
Run Code Online (Sandbox Code Playgroud)
我可以使用此 df 使用以下代码创建并行图:
fig = px.parallel_categories(herbdf, dimensions=['01h', '04h', '08h','24h','48h'],
labels={'01h':'', '04h':'', '08h':'','24h':'','48h':''})
fig.show()
Run Code Online (Sandbox Code Playgroud)
然而,每个时间点的类别(上、下、NC)并不总是相同的顺序,这使得该图非常难以阅读。我可以在笔记本的交互式图形中更改此设置,但我只能选择将校正后的图形输出为低质量 png。我需要 svg 格式的图像,这意味着我需要使用以下行:
fig.write_image("/figs/herb_de_pp.svg")
Run Code Online (Sandbox Code Playgroud)
但是当我在代码块中添加这一行来保存图形时,我无法控制分类框最终的顺序:
我尝试添加fig.update_行来解决这个问题,例如:
fig.update_layout(xaxis={'categoryorder':'total descending'})
Run Code Online (Sandbox Code Playgroud)
但这似乎根本没有改变输出。
我可能会错过一些简单的东西 - 任何帮助将不胜感激!
我想绘制一个类似于平行坐标图的图来进行描述性统计。我想绘制按性别分层的每个变量的平均值和标准差。
不幸的是,我无法找到为每个变量创建自己的 y 轴的方法。
它看起来应该与此图类似,但使用平均值和标准差而不是每一行。
在这篇文章中,他们创建了另一个图,但我无法根据我的需求和数据进行调整,因此平均值和标准差如上图所示。
这是我的数据和代码:
library(dplyr)
library(tidyr)
library(ggplot2)
my_data <- data.frame(
sex = c("m", "w", "m", "w", "m", "w"),
age = c(25, 30, 22, 35, 28, 46),
testosterone = c(450, 200, 400, 300, 500, 350),
cognition = c(75, 80, 70, 85, 78, 90),
estrogen = c(20, 40, 15, 50, 10, 45)
)
numeric_vars <- c("age", "testosterone", "cognition", "estrogen")
# Calculate means and standard deviations for each sex and each variable
df_means <- my_data %>%
group_by(sex) %>% …
Run Code Online (Sandbox Code Playgroud)