python - 使用分类值时如何保留散点图中轴的顺序?

标签 python matplotlib scatter-plot

我想创建一个散点图,以 ntiles 汇总我的数据。由于散点图不能将 Interval 类型作为轴参数,我将值转换为字符串,但这会丢失 Intervals 的顺序,请参阅下面的 x 轴不是从低到高排序。
如何保留顺序?

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.colors
import numpy as np


n_tile = 5
np.random.seed(0)
x = np.random.normal(150, 70, 3000,)
y = np.random.normal(1, 0.3, 3000)
r = np.random.normal(0.4, 0.1, 3000)

plot_data = pd.DataFrame({
            'x': x,
            'y': y,
            'r': r
                })
plot_data['x_group'] = pd.qcut(plot_data['x'], n_tile, duplicates='drop')
plot_data['y_group'] = pd.qcut(plot_data['y'], n_tile, duplicates='drop')
plot_data_grouped = plot_data.groupby(['x_group','y_group'], as_index=False).agg({'r':['mean','count']})
plot_data_grouped.columns = ['x','y','mean','count']

cmap = plt.cm.rainbow
norm = matplotlib.colors.Normalize(vmin=0, vmax=1)

plt.figure(figsize=(10,10))
plt.scatter(x=[str(x) for x in plot_data_grouped['x']], 
            y=[str(x) for x in plot_data_grouped['y']], 
            s=plot_data_grouped["count"], 
            c=plot_data_grouped['mean'], cmap="RdYlGn", edgecolors="black")
plt.show()

enter image description here

最佳答案

这里有两种解决方案。更简单(更好的解决方案)是简单地将 matplotlib 升级到更新的版本。

如果这不是一个选项,首选的替代方法是分别处理散点图和刻度标记,这可以非常简单地完成。例如:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.colors
import numpy as np

n_tile = 5
np.random.seed(0)
x = np.random.normal(150, 70, 3000,)
y = np.random.normal(1, 0.3, 3000)
r = np.random.normal(0.4, 0.1, 3000)

plot_data = pd.DataFrame({'x': x, 'y': y, 'r': r})
plot_data['x_group'] = pd.qcut(plot_data['x'], n_tile, duplicates='drop')
plot_data['y_group'] = pd.qcut(plot_data['y'], n_tile, duplicates='drop')
plot_data_grouped = plot_data.groupby(['x_group','y_group'], as_index=False).agg({'r':['mean','count']})
plot_data_grouped.columns = ['x','y','mean','count']

cmap = plt.cm.rainbow
norm = matplotlib.colors.Normalize(vmin=0, vmax=1)

plt.figure(figsize=(10,10))
x = range(len(plot_data_grouped['x']))
y = range(len(plot_data_grouped['y']))
X, Y = np.meshgrid(x, y)
plt.scatter(x=X.flatten(), 
            y=Y.flatten(), 
            s=plot_data_grouped["count"], 
            c=plot_data_grouped['mean'], cmap="RdYlGn", edgecolors="black")
plt.xticks(x, [str(e) for e in plot_data_grouped['x']])
plt.yticks(y, [str(e) for e in plot_data_grouped['y']])
plt.show()

关于python - 使用分类值时如何保留散点图中轴的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61123196/

相关文章:

r - 在 ggpairs (GGally) 中操作轴标题

python - 如何自动对 Django 表单字段进行排序

python - 在 Linux 上使用可滚动的 x(时间/水平)轴绘制数据

javascript - 使用 d3.js 在散点图中显示靠近鼠标指针的工具提示

python - Matplotlib 显示错误 - 窄条和扭曲的轴

matplotlib - 在 matplotlib 中获取图例的宽度

不允许从 Shiny 的输出对象中读取对象?

python - 操作系统错误 : cannot load library 'C:\Program Files\R\R-4.0.2\bin\x64\R.dll' : error 0x7e

python - 正则表达式将主题标签拆分为单词

python - 如何衡量两个 python 代码块之间的相似性?