У меня есть следующий код из книги машинного обучения в python:
copy_set.plot(kind = "scatter" , x = "longitude" ,
y = "latitude" , alpha = 0.4 ,
s = copy_set[ "population" ],
label = "population" , figsize=(10,7),
c = "median_house_value" , cmap = plt.get_cmap ( "jet" ) )
median_house_value
и population
- это два столбца в copy_set
. Я не понимаю, почему для аргумента s
я должен использовать copy_set['population']
, но для аргумента c
можно использовать только имя столбца median_house_value
. Когда я пытаюсь использовать имя столбца для параметра s
, я получаю сообщение об ошибке:
TypeError: ufunc 'sqrt' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
Очень хороший вопрос. df.plot
- это оболочка вокруг нескольких функций построения графика matplotlib. Для kind="scatter"
функция scatter
matplotlib будет вызвана. Большинство аргументов df.plot()
сначала преобразуются в данные в пределах Series
вы получаете из столбца dataframe соответствующего имени.
Например
df.plot(x="lon", y="lat")
будут преобразованы в
ax.scatter(x=df["lon"].values, y=df["lat"].values)
Остальные аргументы передаются для разброса, следовательно
df.plot(x="lon", y="lat", some_argument_pandas_doesnt_know=True)
приведет к
ax.scatter(x=df["lon"].values, y=df["lat"].values, some_argument_pandas_doesnt_know=True)
Поэтому, в то время как pandas преобразует th аргументов x
, y
, c
, он не делает этого для s
. s
, следовательно, просто передается на ax.scatter
, но функция matplotlib не знает, что означало бы какую-то строку, например "population"
.
Для аргументов, передаваемых в функцию matplotlib, необходимо придерживаться подписи matplotlib, а в случае s
- напрямую передавать данные.
Обратите внимание, однако, что разброс matplotlib также позволяет использовать строки для своих аргументов. Это, однако, требует сказать, из какого набора данных они должны быть взяты. Это делается с помощью аргумента data
. Следовательно, следующее работает отлично и будет matplotlib, эквивалентным вызову панд в вопросе:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np; np.random.seed(42)
df = pd.DataFrame(np.random.rand(20,2), columns=["lon", "lat"])
df["pop"] = np.random.randint(5,300,size=20)
df["med"] = np.random.rand(20)*1e5
fig, ax = plt.subplots(figsize=(10,7))
sc = ax.scatter(x = "lon", y = "lat", alpha = 0.4,
s = "pop", label = "population" ,
c = "med" , cmap = "jet", data=df)
fig.colorbar(sc, label="med")
ax.set(xlabel="longitude", ylabel="latitude")
plt.show()
Наконец, вы можете теперь спросить, может ли поставка данных в matplotlib через аргумент data
одинаково возможным при прохождении через оболочку pandas. К сожалению, нет, потому что pandas использует data
как аргумент внутри, так что он не будет передан. Поэтому ваши два варианта:
s
вместо имени столбца.x
и y
и принимает для них метки. В случае разброса это тоже c
.
copy_set.info()
?