Pandas.plotting.parallel_coordinates 中的绘图顺序
Order of plotting in Pandas.plotting.parallel_coordinates
我有一系列测量值要绘制为 pandas.plotting.parallel_coordinates,其中每条线的颜色由一个 pandas.column.
的值给出
代码如下所示:
... data retrieval and praparation from a couple of Excel files
---> output = 'largeDataFrame'
theColormap: ListedColormap = cm.get_cmap('some cmap name')
# This is a try to stack the lines in the right order.. (doesn't work)
largeDataFrames.sort_values(column_for_line_color_derivation, inplace=True, ascending=True)
# here comes the actual plotting of data
sns.set_style('ticks')
sns.set_context('paper')
plt.figure(figsize=(10, 6))
thePlot: plt.Axes = parallel_coordinates(largeDataFrame, class_column=column_for_line_color_derivation, cols=[columns to plot], color=theColormap.colors)
plt.title('My Title')
thePlot.get_legend().remove()
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()
这工作得很好并产生以下结果:
现在我想将黄线(“column_for_line_color_derivation”的高值绘制在绿色和深色线的前面,使它们变得更加突出。换句话说,我想通过“column_for_line_color_derivation”的值来影响堆叠线的顺序。到现在我还没有找到办法。
我 运行 使用 pandas 版本 1.1.2 和 1.0.3 进行了一些测试,在这两种情况下,线条都是从着色列的低值到高值绘制的,与数据框无关订单。
可以临时加上parallel_coordinates(...., lw=5)
这样就很清楚了。使用细线时,顺序不太明显,因为黄线的对比度较低。
参数sort_labels=
似乎与其名字有相反的效果:当False
(默认)时,线条按排序顺序绘制,当True
时,它们保持数据帧顺序。
这是一个可重现的小例子:
import numpy as np
import pandas as pd
from pandas.plotting import parallel_coordinates
import matplotlib.pyplot as plt
df = pd.DataFrame({ch: np.random.randn(100) for ch in 'abcde'})
df['coloring'] = np.random.randn(len(df))
fig, axes = plt.subplots(ncols=2, figsize=(14, 6))
for ax, lw in zip(axes, [1, 5]):
parallel_coordinates(df, class_column='coloring', cols=df.columns[:-1], colormap='viridis', ax=ax, lw=lw)
ax.set_title(f'linewidth={lw}')
ax.get_legend().remove()
plt.show()
一个想法是根据 class:
改变线宽
fig, ax = plt.subplots(figsize=(8, 6))
parallel_coordinates(df, class_column='coloring', cols=df.columns[:-1], colormap='viridis', ax=ax)
num_lines = len(ax.lines)
for ind, line in enumerate(ax.lines):
xs = line.get_xdata()
if xs[0] != xs[-1]: # skip the vertical lines representing axes
line.set_linewidth(1 + 3 * ind / num_lines)
ax.set_title(f'linewidth depending on class_column')
ax.get_legend().remove()
plt.show()
我有一系列测量值要绘制为 pandas.plotting.parallel_coordinates,其中每条线的颜色由一个 pandas.column.
的值给出代码如下所示:
... data retrieval and praparation from a couple of Excel files
---> output = 'largeDataFrame'
theColormap: ListedColormap = cm.get_cmap('some cmap name')
# This is a try to stack the lines in the right order.. (doesn't work)
largeDataFrames.sort_values(column_for_line_color_derivation, inplace=True, ascending=True)
# here comes the actual plotting of data
sns.set_style('ticks')
sns.set_context('paper')
plt.figure(figsize=(10, 6))
thePlot: plt.Axes = parallel_coordinates(largeDataFrame, class_column=column_for_line_color_derivation, cols=[columns to plot], color=theColormap.colors)
plt.title('My Title')
thePlot.get_legend().remove()
plt.xticks(rotation=90)
plt.tight_layout()
plt.show()
这工作得很好并产生以下结果:
现在我想将黄线(“column_for_line_color_derivation”的高值绘制在绿色和深色线的前面,使它们变得更加突出。换句话说,我想通过“column_for_line_color_derivation”的值来影响堆叠线的顺序。到现在我还没有找到办法。
我 运行 使用 pandas 版本 1.1.2 和 1.0.3 进行了一些测试,在这两种情况下,线条都是从着色列的低值到高值绘制的,与数据框无关订单。
可以临时加上parallel_coordinates(...., lw=5)
这样就很清楚了。使用细线时,顺序不太明显,因为黄线的对比度较低。
参数sort_labels=
似乎与其名字有相反的效果:当False
(默认)时,线条按排序顺序绘制,当True
时,它们保持数据帧顺序。
这是一个可重现的小例子:
import numpy as np
import pandas as pd
from pandas.plotting import parallel_coordinates
import matplotlib.pyplot as plt
df = pd.DataFrame({ch: np.random.randn(100) for ch in 'abcde'})
df['coloring'] = np.random.randn(len(df))
fig, axes = plt.subplots(ncols=2, figsize=(14, 6))
for ax, lw in zip(axes, [1, 5]):
parallel_coordinates(df, class_column='coloring', cols=df.columns[:-1], colormap='viridis', ax=ax, lw=lw)
ax.set_title(f'linewidth={lw}')
ax.get_legend().remove()
plt.show()
一个想法是根据 class:
改变线宽fig, ax = plt.subplots(figsize=(8, 6))
parallel_coordinates(df, class_column='coloring', cols=df.columns[:-1], colormap='viridis', ax=ax)
num_lines = len(ax.lines)
for ind, line in enumerate(ax.lines):
xs = line.get_xdata()
if xs[0] != xs[-1]: # skip the vertical lines representing axes
line.set_linewidth(1 + 3 * ind / num_lines)
ax.set_title(f'linewidth depending on class_column')
ax.get_legend().remove()
plt.show()